Ruby on rails。将params从视图传递到控制器

时间:2016-02-04 12:11:40

标签: ruby-on-rails controller params link-to

我有我认为必须是一个简单的问题,但我无法理解。我正在尝试在创建另一个模型时更新一个模型中的属性。

在我看来:

<%= 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:

我知道params正在传递,'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:

我尝试使用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'。

params传递给'New'动作但不传递'Create'动作。我觉得这应该很容易,但我现在还没有看到它。

3 个答案:

答案 0 :(得分:1)

问题是,您从未在create方法中为@gig分配值。我无法看到您的表单,但您在创建方法中需要这样的内容:

@gig = Gig.find params[:gigid]

假设您将参数:gigid传递给#create

在你展示的第二个例子中,我不确定发生了什么,但你应该在find()上获得一个ActiveRecord :: RecordNotFound异常。

答案 1 :(得分:1)

  

但是我得到了未定义的方法&n;更新&#39;为nil:NilCLass:

错误是您未在@gig操作中定义create

由于Rails是基于HTTP和HTTP is stateless构建的,因此您必须设置&#34;实例&#34;每个新请求的变量:

def new
  @review = Review.new
  @gig    = Gig.find params[:gigid]
end

def create
 @gig    = Gig.find params[:gigid]
 @review = @user.reviews.new review_params

很多更好的模式是在after_create模型中使用Review回调:

#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可用,您可以在代码中使用该操作。

答案 2 :(得分:0)

请尝试以下代码进行更新操作。

gig_record = Gig.find_by_id(params[:gigid])
gig_record.update_attribute(reviewed: true) unless gig_record.blank?