Rails形成不拯救城市

时间:2017-07-30 03:23:41

标签: ruby-on-rails activerecord activemodel

我正在尝试为客户创建rails表单。他们应该选择一个城市作为现有城市的列表。但它没有得救。

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

3 个答案:

答案 0 :(得分:1)

尝试修改customer_params以允许city_id属性,目前您只定义了city

def customer_params
  params.require(:customer).permit(:first_name, :last_name, :phone_number, :city_id)
end

尝试将city id属性添加到表单选择标记中,您只需映射名称,您可以使用pluck轻松实现:

<%= f.select :city_id, City.all.pluck(:name, :id) %>

我建议您在控制器中创建一个实例变量,然后再使用它。

答案 1 :(得分:1)

在表单中,您使用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

答案 2 :(得分:1)

我可以使用options_for_select

修复它
<%= f.select :city_id, options_for_select(City.all.map{ |city| [city.name, city.id]}) %>