[英]Ruby on rails. Passing params from view to controller
我遇到的问题肯定是一个简单的问题,但我无法弄清楚。 我正在尝试在创建另一个模型时更新一个模型中的属性。
在我看来:
<%= link_to 'Click here to rate this user', new_user_review_path(:user_id => request.user.id, :gigid => request.gig.id), remote: true %>
通过参数:gigid
和:user_id
比我的控制器:
def new
@review = Review.new
@gig = Gig.find(params[:gigid])
end
def create
@review = @user.reviews.new review_params
@review.reviewed_id = current_user.id
if @review.save
@gig.update(reviewed: true)
respond_to do |format|
format.html {redirect_to session.delete(:return_to), flash[:notice] = "Thankyou for your rating!"}
format.js
end
else
render 'new'
end
end
但是我undefined method 'update'for nil:NilCLass:
获取了undefined method 'update'for nil:NilCLass:
我知道参数已经过去了,“ Gig”可以更新为:
def new
@review = Review.new
Gig.find(params[:gigid]).update(reviewed: true)
end
会很好地更新属性,但是当我单击“新建评论”时,实际上不会创建评论。
新增:
def create
@review = @user.reviews.new review_params
@review.reviewed_id = current_user.id
if @review.save
Gig.find(params[:gigid]).update(reviewed: true)
etc etc etc
给我undefined method 'update'for nil:NilCLass:
相同的undefined method 'update'for nil:NilCLass:
我尝试用find_by_id
而不是find
没什么区别。
编辑:
def create
@gig = Gig.find params[:gigid]
@review = @user.reviews.new review_params
@review.reviewed_id = current_user.id
if @review.save
@gig.update(reviewed: true)
etc etc etc
也不起作用。 我没有收到任何错误,但演出ID仍然为“ nil”。
参数传递给“ New”动作,而不传递给“ Create”动作。 我觉得这应该很容易,但是我暂时还没有看到。
问题是,您从未在create方法中为@gig分配值。 我看不到您的表单,但是您在create方法中需要这样的东西:
@gig = Gig.find params[:gigid]
假设您要将参数:gigid传递给#create
在您显示的第二个示例中,我不确定发生了什么,但是您应该在find()上遇到ActiveRecord :: RecordNotFound异常。
但是我为nil:NilCLass获取了未定义的方法'update':
错误是您尚未在create
动作中定义@gig
。
由于Rails是基于HTTP构建的,而HTTP是无状态的 ,因此您必须为每个新请求设置“实例”变量:
def new
@review = Review.new
@gig = Gig.find params[:gigid]
end
def create
@gig = Gig.find params[:gigid]
@review = @user.reviews.new review_params
对您而言,更好的模式是在Review
模型中使用after_create
回调:
#app/models/review.rb
class Review < ActiveRecord::Base
belongs_to :gig #-> I presume
after_create :set_gig
private
def set_gig
self.gig.update(reviewed: true)
end
end
-
如果要在当前设置中更新Gig
,则最好通过请求(而非链接)发送gig_id
参数:
#app/views/reviews/new.html.erb
<%= form_for [@user, @review] do |f| %>
<%= f.hidden_field :gig_id, @gig.id %> #-> params[:reviews][:gig_id]
...
<% end %>
这将使params[:review][:gig_id]
在现有的create
行动,你就可以在你的代码中使用。
请尝试以下代码进行更新操作。
gig_record = Gig.find_by_id(params[:gigid])
gig_record.update_attribute(reviewed: true) unless gig_record.blank?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.