Rails 表格不保存城市
Rails form not saving city
我正在尝试为客户创建 rails 表单。他们应该 select 一个城市作为现有城市的列表。但是没有被保存。
index.html.erb
<%= form_for @customer do |f| %>
<div class="field">
<%= f.label :first_name %><br>
<%= f.text_field :first_name %>
</div>
<div class="field">
<%= f.label :last_name %><br>
<%= f.text_field :last_name %>
</div>
<div class="field">
<%= f.label :phone_number %><br>
<%= f.text_field :phone_number %>
</div>
<div class="field">
<%= f.label :city %><br>
<%= f.select :city_id, City.all.map(&:name) %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
city.rb
class City < ActiveRecord::Base
validates_presence_of :name
has_many :customers
end
customer.rb
class Customer < ActiveRecord::Base
validates_presence_of :first_name
validates_presence_of :last_name
validates_uniqueness_of :phone_number
belongs_to :city
end
customer_controller.orb
def create
@customer = Customer.find_or_initialize_by(customer_params)
respond_to do |format|
if @customer.save
format.html { redirect_to @customer, notice: 'Customer was successfully created.' }
format.json { render :show, status: :created, location: @customer }
else
format.html { render :new }
format.json { render json: @customer.errors, status: :unprocessable_entity }
end
end
end
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city)
end
尝试修改 customer_params
以允许 city_id
属性,目前您只定义了 city
:
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city_id)
end
也尝试将城市 ID 属性添加到您的表单 select 标记中,您只是映射名称,您可以使用 pluck
:
轻松实现它
<%= f.select :city_id, City.all.pluck(:name, :id) %>
我建议您在控制器中创建一个实例变量,然后使用它。
在您的表单中,您使用 city_id
<div class="field">
<%= f.label :city %><br>
<%= f.select :city_id, City.all.map(&:name) %>
</div>
但是在你的控制器中你使用 city
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city)
end
另一个错误可能是您使用城市模型的名称作为选项的值,而不是模型的 id,因此,这个字符串(而不是数字 id)被传递给 find_or_initialize_by
.
我可以使用 options_for_select
修复它
<%= f.select :city_id, options_for_select(City.all.map{ |city| [city.name, city.id]}) %>
我正在尝试为客户创建 rails 表单。他们应该 select 一个城市作为现有城市的列表。但是没有被保存。
index.html.erb
<%= form_for @customer do |f| %>
<div class="field">
<%= f.label :first_name %><br>
<%= f.text_field :first_name %>
</div>
<div class="field">
<%= f.label :last_name %><br>
<%= f.text_field :last_name %>
</div>
<div class="field">
<%= f.label :phone_number %><br>
<%= f.text_field :phone_number %>
</div>
<div class="field">
<%= f.label :city %><br>
<%= f.select :city_id, City.all.map(&:name) %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
city.rb
class City < ActiveRecord::Base
validates_presence_of :name
has_many :customers
end
customer.rb
class Customer < ActiveRecord::Base
validates_presence_of :first_name
validates_presence_of :last_name
validates_uniqueness_of :phone_number
belongs_to :city
end
customer_controller.orb
def create
@customer = Customer.find_or_initialize_by(customer_params)
respond_to do |format|
if @customer.save
format.html { redirect_to @customer, notice: 'Customer was successfully created.' }
format.json { render :show, status: :created, location: @customer }
else
format.html { render :new }
format.json { render json: @customer.errors, status: :unprocessable_entity }
end
end
end
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city)
end
尝试修改 customer_params
以允许 city_id
属性,目前您只定义了 city
:
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city_id)
end
也尝试将城市 ID 属性添加到您的表单 select 标记中,您只是映射名称,您可以使用 pluck
:
<%= f.select :city_id, City.all.pluck(:name, :id) %>
我建议您在控制器中创建一个实例变量,然后使用它。
在您的表单中,您使用 city_id
<div class="field">
<%= f.label :city %><br>
<%= f.select :city_id, City.all.map(&:name) %>
</div>
但是在你的控制器中你使用 city
def customer_params
params.require(:customer).permit(:first_name, :last_name, :phone_number, :city)
end
另一个错误可能是您使用城市模型的名称作为选项的值,而不是模型的 id,因此,这个字符串(而不是数字 id)被传递给 find_or_initialize_by
.
我可以使用 options_for_select
<%= f.select :city_id, options_for_select(City.all.map{ |city| [city.name, city.id]}) %>