2016-04-03 8 views
0

私はこれを約5時間今行っており、すべてを試しました。私は限られたレール経験を持つフロントエンドの開発者なので、ベースを100%オフにすることができます。ここでRails has_many:through、checkboxes not working with

私のモデルです:

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 %> 

ページを読み込んでアパートを保存してもアメニティは実際には保存されません。見ていただきありがとうございます。

答えて

0

私はあなたが以下のようにamenities_attributesの名前を許可する必要があると思う:

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

そのフォームフィールドがあなたの強いのparamsに一致しないため。フォームのソースコードを見てください。私はあなたが、n個のチェックボックスが

apartment[amenities] 

のようなものを見てしかし、あなたの強いのparamsは、ネストされたハッシュとしてamenities_attributesを持っていることがわかります疑います。ログのparamsハッシュを見ると、フォームデータのフォーマット方法がわかります。 fields_forを使用するようにフォームを変更するか、強いパラメータを変更する必要があります

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

閉じる。私は、ActiveRecord :: AssociationTypeMismatchをAdmin :: ApartmentsController#createで取得しましたが、フォームを<%= f.collection_check_boxes(:amenity_ids、Amenity.all、:id、:name)%> 'に変更しました。 params.require(:apartment).permit(:name、:address、:website、amenity_ids:[])への強力なパラメータは、 – Will