如何更新rails 4上的ruby中的嵌套属性?

时间:2015-01-19 14:18:57

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个模型服务和评论 评论代码是(comment.rb):

class Comment < ActiveRecord::Base
belongs_to :service
belongs_to :user
end

service.rb文件:

class Service < ActiveRecord::Base
has_many :comments, :dependent => :destroy
accepts_nested_attributes_for :comments, :reject_if => lambda { |a| a    [:content].blank? }, :allow_destroy => true
end

我使用下面的视图成功更新了评论:

<%= form_for(@service) do |f| %>

<%= f.fields_for :comments, @comment do |c| %>
<%= c.text_area :content,:rows =>10, :cols => 60, :class => 'editme'%><br />
<%end%>
<div class="actions">
<%= f.submit "Add Comment" %>
</div>

<% end %>

服务控制器中的更新方法如下:

def update
respond_to do |format|
  if @service.update(service_params)

    @service.update(:comments_attributes => {:user_id => 9 })
    format.html { redirect_to @service, notice: 'Service was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: 'edit' }
    format.json { render json: @service.errors, status: :unprocessable_entity }
  end
end
end

def service_params
  params.require(:service).permit(:sname, :scategory, :cat_description,   :min_name, :min_description, :min_start_date, :min_end_date,comments_attributes: [:content,:service_id,:user_id,:uname])
end

以下集合正在从视图传递到控制器,正如正确更新注释表一样。

"service"=>{"comments_attributes"=>{"0"=>{"content"=>"<p>hh</p>"}}}

现在注释表有user_id列,我试图在update方法中从session [:user_id]更新。我尝试过几个选项,但没有一个可以使用。

# @comment.user_id=session[:user_id]
    #@service.comments.assign_attributes.first(id:  '26',{comments_attributes: {user_id: "#{session[:user_id]}"}})

你能不能让我知道我在这里做错了什么?如何在服务控制器的更新方法中更新注释表中的user_id列,我是ruby on rails的新手任何指针都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我们建议您从:user_id方法中移除params.require(...).permit(...),不要在视图中使用它,以便将其作为comments_attributes中的参数发送。因为,它将打败拥有强大的障碍的目的。而是在控制器中过滤后更新params散列:

def service_params
  updated_service_params = params.require(:service).permit(:sname, :scategory, :cat_description, :min_name, :min_description, :min_start_date, :min_end_date, comments_attributes: [:content, :service_id, :uname])
  updated_service_params[:comments_attributes].each{ |k, v| v.merge!(user_id: session[:user_id]) } if updated_service_params && updated_service_params[:comments_attributes]
  updated_service_params
end

现在您的update方法可以是:

def update
  respond_to do |format|
    if @service.update(service_params)

      format.html { redirect_to @service, notice: 'Service was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: 'edit' }
      format.json { render json: @service.errors, status: :unprocessable_entity }
    end
  end
end