簡體   English   中英

Ruby在軌道上。 將參數從視圖傳遞到控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM