3

has_manyとの関係を使用して、3 つのモデルを持つ Rails 3 アプリを作成しようとしていますbelongs_toAssociationTypeMismatchフォームを送信しようとするとエラーが発生します。具体的Location(#70232625418240) expected, got String(#70232609906560)には、私が設定したモデルは次のとおりです。

  • 食べ物
  • 位置

現在、Food モデルと Location モデルの接続に取り組んでいます。@foodチェックボックスとしてエントリを取り込む単純なフォーム フォームを作成しました@locationlocationsさまざまな場所をチェックして選択し、Food モデルのインデックスに関連付けたいと思います。

チェックボックスを配列として送信しようとしているので、場所を食べ物に関連付けることができます。そのため、場所 ID を送信します。これにより、食品エントリに関連付けられた各場所の場所名を取得できると思います。

私のモデルはこのように設定されています:

food.rb

class Food < ActiveRecord::Base
  attr_accessible :area, :description, :icon, :iconSource, :image, :locations, :months, :name, :source, :type, :month_id
  has_many :locations
  has_many :months
end

location.rb

class Location < ActiveRecord::Base
  attr_accessible :city, :region, :regionName, :state, :title, :food_id, :month_id, :locations_id
  has_many :months
  belongs_to :foods
end

私が設定したフォームは次のようになります。

new.html.erb

<%= form_for @food do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
    <div class="field">
        <%= f.text_field :name, placeholder: "Name", :class => 'field-name' %>
    </div>

    <% for location in Location.find(:all) %>
        <div>
          <%= check_box_tag "food[locations_id][]", location.id %>
          <%= location.title %>
        </div>
    <% end %>

    <%= f.submit "Post" %>
<% end %>

Foods コントローラーは create アクションを使用してフォームを処理しています。

food_controller.rb

class FoodsController < ApplicationController
  def index
    @foods = Food.all
  end
  def new
    @food = Food.new
    @locations = Location.all
  end
  def create
    @food = Food.new(params[:food])
    if @food.save
        redirect_to foods_url(@food), :notice => "Food created!"
    else
      render :action => "new"
    end
  end
end

Foods モデルに関連するデータのみを入力している場合、フォームは問題なく送信されます。しかし、場所のチェックボックスの 1 つを選択してフォームを送信しようとすると、このLocation(#70232625418240) expected, got String(#70232609906560)エラーが発生します。残りの出力は次のとおりです。

app/controllers/foods_controller.rb:10:in `new'
app/controllers/foods_controller.rb:10:in `create'

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"QThXhDG8pPJcRVTTW6FXmo6MhGcoUeUspBhRtrbsbig=",
 "food"=>{"name"=>"Apple",
 "locations"=>["1"]},
 "commit"=>"Post"}

これを数時間調べた後、これを修正するために見つけたすべてのことを試しました。の代わりにを使用する必要があることに気づきました。しかしその後、私はここで他のソリューションに空っぽになっています。誰かに同様の問題がありましたか?location_idlocations

4

2 に答える 2

4

location_idsの代わりに使用locations_id:

<%= check_box_tag food[location_ids], location.id -%>

rails 3 has_many :through Form withcheckboxesへの回答もお読みください。

編集:

:location_idfood[location_ids]

これを に追加location_idattr_accessibleます。

于 2013-08-28T11:46:16.587 に答える
1

この問題が発生したとき、accepts_nested_attributes_for を使用して解決しました。

class Food < ActiveRecord::Base
  attr_accessible :area, :description, :icon, :iconSource, :image, :locations, :months,  :name, :source, :type, :month_id
  has_many :locations
  has_many :months

  accepts_nested_attributes_for :locations, :allow_destroy => :true

  end

このビデオを参照すると、ビューで何をする必要があるかなどを私よりもよく説明しています。

http://railscasts.com/episodes/196-nested-model-form-part-1

于 2013-08-28T11:45:41.297 に答える