【问题标题】:Rails has_many :through, form with checkboxes not workingRails has_many:通过,带有复选框的表单不起作用
【发布时间】:2016-07-23 05:13:06
【问题描述】:

我已经为此进行了大约 5 个小时,并且几乎尝试了所有方法。我是一名前端开发人员,Rails 经验有限,所以我可能只是 100% 的基础。

这是我的模型:

class Apartment < ActiveRecord::Base
  validates :name, :amenities, presence: true

  has_many :apartment_amenities
  has_many :amenities, through: :apartment_amenities

  accepts_nested_attributes_for :amenities
end

class Amenity < ActiveRecord::Base
  validates :name, presence: true

  has_many :apartment_amenities
  has_many :apartments, through: :apartment_amenities
end

class ApartmentAmenity < ActiveRecord::Base

  belongs_to :apartment
  belongs_to :amenity

end

架构:

  create_table "amenities", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "apartment_amenities", force: :cascade do |t|
    t.integer  "apartment_id"
    t.integer  "amenity_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  add_index "apartment_amenities", ["amenity_id"], name: "index_apartment_amenities_on_amenity_id", using: :btree
  add_index "apartment_amenities", ["apartment_id"], name: "index_apartment_amenities_on_apartment_id", using: :btree

  create_table "apartments", force: :cascade do |t|
    t.string   "name"
    t.string   "address"
    t.string   "website"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

公寓管理员:

class Admin::ApartmentsController < AdminController
  before_action :set_apartment, only: [:edit, :update, :destroy]

  def new
    @apartment = Apartment.new
  end

  def create
    @apartment = Apartment.new(apartment_params)

    respond_to do |format|
      if @apartment.save
        format.html { redirect_to apartments_path, notice: 'Apartment was successfully created.' }
        format.json { render :show, status: :created, location: @apartment }
      else
        format.html { render :new }
        format.json { render json: @apartment.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    def set_apartment
      @apartment = Apartment.find(params[:id])
    end

    def apartment_params
      params.require(:apartment).permit(:name, :address, :website, amenities_attributes: [:id])
    end
end

最后但并非最不重要的新公寓形式

<%= form_for([:admin, @apartment]) do |f| %>
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.collection_check_boxes(:amenities, Amenity.all, :id, :name ) %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

当我加载页面并保存公寓时,一切看起来都正常,但实际上并没有保存设施。谢谢参观。

【问题讨论】:

    标签: ruby-on-rails forms ruby-on-rails-4 has-many-through


    【解决方案1】:

    我认为您需要允许amenities_attributes 的名称如下:

    def apartment_params
      params.require(:apartment).permit(:name, :address, :website, amenities_attributes: [:id, :name])
    end
    

    【讨论】:

      【解决方案2】:

      这是因为您的表单字段与您的强参数不匹配。查看表单的源代码。我怀疑你会发现 n 个复选框看起来像

      apartment[amenities]
      

      但是您的强参数将便利性属性作为嵌套哈希。查看日志中的 params 哈希,您将了解表单数据的格式。您需要更改表单以使用 fields_for 或更改强参数

      params.require(:apartment).permit(:name, :address, :website, amenities: [])
      

      【讨论】:

      • 关闭。当我这样做时,我得到了“Admin::ApartmentsController#create 中的 ActiveRecord::AssociationTypeMismatch”,但是将表单更改为 &lt;%= f.collection_check_boxes(:amenity_ids, Amenity.all, :id, :name ) %&gt; 并将强参数更改为 params.require(:apartment).permit(:name, :address, :website, amenity_ids: []) 成功了
      猜你喜欢
      • 2011-06-30
      • 2011-08-02
      • 2013-04-26
      • 2016-02-18
      • 2012-02-01
      • 2016-11-28
      • 2012-01-21
      • 1970-01-01
      • 2012-02-28
      相关资源
      最近更新 更多