2011-05-12 67 views
0

背景簡介`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添加到Topic模型中。

# 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展開時,當主題創建者編輯主題時,主題中每個帖子的文本區域顯示爲可由主題創建者編輯。

我該怎麼做才能使Topic創建者只能看到並編輯views/topics/_form表單上的Topic的第一篇文章?

回答

0

有用的資源: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