【问题标题】:Rails form not saving city铁轨形成不拯救城市
【发布时间】:2017-07-30 03:23:40
【问题描述】:

我正在尝试为客户创建 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

【问题讨论】:

    标签: ruby-on-rails activerecord activemodel


    【解决方案1】:

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

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

    尝试在表单选择标签中添加城市 id 属性,您只是映射名称,您可以使用 pluck 轻松实现:

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

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

    【讨论】:

    • 我明白了,问题出在您的选择中,您只是传递了城市的名称,我已将该部分添加到答案@AntarrByrd,看看。
    【解决方案2】:

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

    【讨论】:

    • 修复也无济于事
    • 这是选项值。尝试使用&lt;%= f.select :city_id, City.all.map({|p| [ p.name, p.id ] }) %&gt;
    【解决方案3】:

    我可以使用options_for_select修复它

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

    【讨论】:

    • pluck 也可以解决问题,在较短的版本中只需获取名称和 id,因为它是 ActiveRecord,性能处于查询级别,使用 map 你可以获得所有属性并且只使用两个.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2013-06-28
    相关资源
    最近更新 更多