我有两个模型服务和评论 评论代码是(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的新手任何指针都将不胜感激。
答案 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