1

Я пытаюсь отредактировать тему, в которой много сообщений. Редактировать страницу для темы имеет name и Post's content, которые можно редактировать.рельсы: ошибка массового присвоения, вызванная обновлением дочернего элемента (post) от родительского (Тема) контроллера (вид редактирования)

Ошибка массового присваивания происходит в topic_controller.rb, update метод, post.update_attributes(params[:post]).

Как избежать ошибки массового присвоения.

topic.rb

class Topic < ActiveRecord::Base 
    has_many :posts, :dependent => :destroy 
    belongs_to :forum 
    accepts_nested_attributes_for :posts, :allow_destroy => true 
    attr_accessible :name, :last_post_id, :posts_attributes 
end 

post.rb

class Post < ActiveRecord::Base 
    belongs_to :topic 
    attr_accessible :content 
end 

topics_controller.rb

def update 
    @topic = Topic.find(params[:id]) 
    post = @topic.posts.first 
    if @topic.update_attributes(params[:topic]) && post.update_attributes(params[:post]) 
    topic = Topic.find(@post.topic_id) 
    flash[:success] = "Success!" 
    redirect_to topic_posts_path(topic) 
    else 
    render 'edit' 
    end 
end 

просмотров/темы/edit.html.erb

<%= form_for @topic do |f| %> 
    <!-- render 'shared/error_messages_topic' --> 

    <%= f.label :name %> 
    <%= f.text_field :name %> 

    <%= f.fields_for @topic.posts.first do |post| %> 
    <%= render :partial => "posts/form", :locals => {:f => post} %> 
    <% end %> 


    <%= f.submit "Edit", class: "btn btn-large btn-primary" %> 
<% end %> 

просмотров/сообщений/_form.html.erb

<%= f.label :content %> 
<%= f.text_area :content %> 

ответ

2

В способе обновления вам не придется обновлять атрибуты обоих моделей вместо if @topic.update_attributes(params[:topic]) && post.update_attributes(params[:post]) он должен это только if @topic.update_attributes(params[:topic]) будет обновлять сообщения автоматически.

И измените ваш взгляд из этого <%= f.fields_for @topic.posts.first do |post| %> на <%= f.fields_for :posts, @topic.posts.first do |post| %> он будет работать нормально.

Для получения более подробной информации читайте эту http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

+0

'<% = f.fields_for: сообщения, @ topic.posts.first сделать | запись | %> 'Это потрясающий трюк. Спасибо. –