1

我开始使用 Ruby on Rails,但遇到了has_many :through关联问题。

我正在使用的模型是:

class Phrase < ActiveRecord::Base
  attr_accessible :event_type_id, :template_pieces

  belongs_to :event_type
  has_many :phrases_pieces
  has_many :template_pieces, :through => :phrases_pieces
end

class TemplatePiece < ActiveRecord::Base
  attr_accessible :datatype, :fixed_text, :name

  has_many :phrase_pieces
  has_many :phrases, :through => :phrases_pieces
end

class EventType < ActiveRecord::Base
  attr_accessible :name

  has_many :phrases
end

class PhrasesPiece < ActiveRecord::Base
  attr_accessible :order, :phrase_id, :template_piece_id

  belongs_to :phrase
  belongs_to :template_piece
end

我正在尝试创建一个新短语,将其默认形式编辑为:

<%= form_for(@phrase) do |f| %>
  <% if @phrase.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@phrase.errors.count, "error") %> prohibited this phrase from being saved:</h2>

      <ul>
      <% @phrase.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  Select the event type:
    <%= collection_select(:phrase, :event_type_id, EventType.all, :id, :name) %>
    Select the phrases to be used:
    <%= collection_select(:phrase, :template_pieces, TemplatePiece.all, :id, :name) %>

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

我首先遇到了 Mass Assignment 的问题,但我修复了将其添加attr_accessible :template_pieces到短语模型中的问题。我不确定这是否是修复它的正确方法,但至少它停止抱怨它无法批量分配受保护的属性。

现在,提交新短语时出现以下错误:

“1”的未定义方法“每个”:字符串

我有点认为这是因为一个给定的短语应该有很多 template_pieces,但我目前一次只能提交一个。所以它只是找到一个,尝试遍历它并失败。

我将如何解决这个问题?有没有更好的方法将模型输入has_many :through到数据库中?我是否必须手动进行(如解除默认控制器@phrase = Phrase.new(params[:phrase])?

谢谢!

4

1 回答 1

0

您应该使用fields_for帮助器来包装嵌套属性:

<%= f.fields_for :template_pieces do |template_f| %>
  <%= template_f.collection_select, :event_type_id, EventType.all, :id, :name %>
  Select the phrases to be used:
  <%= template_f.collection_select, :template_pieces, TemplatePiece.all, :id, :name %>
<% end %>

参考

fields_for 文档

于 2013-03-06T20:29:57.203 回答