Rails 3.1中同一形式的多个模型?

时间:2011-09-02 22:49:46

标签: ruby-on-rails ruby ruby-on-rails-3 forms

我正在使用Rails 3.1并正在讨论论坛。我有一个名为Topic的模型,每个模型都有很多Post个。当用户创建新主题时,他们也应该创建第一个Post。但是,我不知道如何以同样的形式做到这一点。这是我的代码:

<%= form_for @topic do |f| %>
<p>
    <%= f.label :title, "Title" %><br />
    <%= f.text_field :title %>
</p>

<%= f.fields_for :post do |ff| %>
    <p>
        <%= ff.label :body, "Body" %><br />
        <%= ff.text_area :body %>
    </p>
<% end %>

<p>
    <%= f.submit "Create Topic" %>
</p>
<% end %>

class Topic < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  accepts_nested_attributes_for :posts
  validates_presence_of :title
end


class Post < ActiveRecord::Base
  belongs_to :topic
  validates_presence_of :body
end

...但这似乎不起作用。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

@ Pablo的答案似乎拥有你需要的一切。但更具体一点......

首先在视图中更改此行

<%= f.fields_for :post do |ff| %>

到这个

<%= f.fields_for :posts do |ff| %>  # :posts instead of :post

然后在你的Topic控制器中添加此

def new
  @topic = Topic.new
  @topic.posts.build
end

这应该让你去。

答案 1 :(得分:3)

Ryan Bates herehere

的一个非常好的解释

对于您的特定情况:当您调用fields_for时,您使用的是模型(:post),而不是关联(:posts)。

同时检查<%= ... %>的正确使用方法。在rails 3.x中,构造的bahaviour发生了变化。阻止助手(form_for,fields_for等)不需要它,并且内联助手(text_field,text_area等)确实需要它。