3

我正在尝试创建一个具有三个模型、withhas_manybelongs_to关系的 Rails 3 应用程序。AssociationTypeMismatch当我尝试提交表单时出现错误。具体来说Location(#70232625418240) expected, got String(#70232609906560),我设置的模型是:

  • 食物
  • 地点

现在我正在连接 Food 和 Location 模型。我创建了一个简单的表单表单,它从复选框@food中提取条目。@location我想通过勾选它们来选择不同的位置,并将它们与locations我的 Food 模型中的索引相关联。

我正在尝试将复选框作为数组提交,以便将位置与食物相关联。所以我提交了位置 ID,我相信这将允许我为每个与食物条目相关的位置名称提取位置名称。

我的模型是这样设置的:

食物.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

位置.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

我设置的表格如下所示:

新的.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 模型相关的数据时,表单提交得很好。但是当我选择一个位置复选框并尝试提交表单时,我收到了这个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_id不是locations. 但在那之后,我在这里对其他解决方案一无所知。有没有人有类似的问题?

4

2 回答 2

4

使用location_ids代替locations_id

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

另请阅读rails 3 has_many 的答案:通过 Form with checkboxes

编辑:

: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 回答