Ruby 在 rails。将参数从视图传递到控制器
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:
我知道参数正在传递,'Gig' 可以更新为:
def new
@review = Review.new
Gig.find(params[:gigid]).update(reviewed: true)
end
可以很好地更新属性,但是当我单击时 'New review' 不是在实际创建评论时。
添加:
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:
我试过用 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' 操作。我觉得这应该很容易,但我现在还没有看到。
尝试使用以下代码进行更新操作。
gig_record = Gig.find_by_id(params[:gigid])
gig_record.update_attribute(reviewed: true) unless gig_record.blank?
问题是,您从未在创建方法中为@gig 赋值。我看不到你的表单,但你在创建方法中需要这样的东西:
@gig = Gig.find params[:gigid]
假设您将参数 :gigid 传递给#create
在你展示的第二个例子中,我不确定发生了什么,但你应该在 find() 上得到一个 ActiveRecord::RecordNotFound 异常。
But I get undefined method 'update'for nil:NilCLass:
错误是您没有在 create
操作中定义 @gig
。
由于 Rails 是基于 HTTP 构建的,并且 HTTP is stateless,您必须为每个新请求设置 "instance" 变量:
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
参数(而不是 link):
#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
操作中可用,您将能够在代码中使用它。
我遇到了一个我认为一定很简单的问题,但我就是想不通。我正在尝试在创建另一个模型时更新一个模型中的属性。
在我看来:
<%= 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:
我知道参数正在传递,'Gig' 可以更新为:
def new
@review = Review.new
Gig.find(params[:gigid]).update(reviewed: true)
end
可以很好地更新属性,但是当我单击时 'New review' 不是在实际创建评论时。
添加:
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:
我试过用 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' 操作。我觉得这应该很容易,但我现在还没有看到。
尝试使用以下代码进行更新操作。
gig_record = Gig.find_by_id(params[:gigid])
gig_record.update_attribute(reviewed: true) unless gig_record.blank?
问题是,您从未在创建方法中为@gig 赋值。我看不到你的表单,但你在创建方法中需要这样的东西:
@gig = Gig.find params[:gigid]
假设您将参数 :gigid 传递给#create
在你展示的第二个例子中,我不确定发生了什么,但你应该在 find() 上得到一个 ActiveRecord::RecordNotFound 异常。
But I get undefined method 'update'for nil:NilCLass:
错误是您没有在 create
操作中定义 @gig
。
由于 Rails 是基于 HTTP 构建的,并且 HTTP is stateless,您必须为每个新请求设置 "instance" 变量:
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
参数(而不是 link):
#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
操作中可用,您将能够在代码中使用它。