Ruby on Rails 3 - 'accepts_nested_attributes_for',但只修改第一个子



简要背景

我正在做一个传统的论坛来学习/练习Rails。

User Model
  has_many :topics
  has_many :posts
Topic Model
  has_many :posts
  belongs_to :user
Post Model
  belongs_to :user
  belongs_to :topic

但是,当用户创建新主题时,我也希望他们同时在该主题中创建第一个帖子(就像论坛工作一样)。此外,当主题创建者编辑主题时,他也会编辑第一篇文章。

因此,我向主题模型添加了accepts_nested_attributes_for :posts

# TopicController
def new
  @topic = current_user.topics.new
  @topic.posts.build
end

这是嵌套形式:

# topics/_form
<%= form_for [@topic] do |topic| %>
  <%= topic.text_field :name %>
  <% topic.fields_for :posts do |post| %>
    <%= post.text_area :content %>
  <% end %>
<% end %>

问题

此代码有效。用户将在创建主题的同时创建第一个帖子。

但是,当其他用户为主题创建帖子并且@topic.posts展开时,当主题创建者编辑主题时,主题中每个帖子的文本区域将显示为可由主题创建者编辑。

如何使主题创建者只能在views/topics/_form表单上查看和编辑主题的第一篇文章?

有用的资源:http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

topics/_form旁边创建了一个名为_edit_form的新部分,仅用于topics#edit操作。

阅读 API 文档(去图),我发现您可以为 forms_for 指定一个实例:

<%= form_for @topic do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.fields_for :posts, ---->@post<---- do |p| %>
        <%= p.text_area :content %>
    <% end %>
  </p>
  <p><%= f.submit %></p>
<% end %>

在主题控制器中:

def edit
  @topic = ...
  @post = @topic.posts.first
end

相关内容

  • 没有找到相关文章