0

updateアクションからアクションを呼び出す必要がある状況がありますcreate

def create
  @product = Product.find_or_initialize_by_sku(params[:sku])
  if @product.new_record?
    respond_to do |format|
      if @product.save
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render json: @product, status: :created, location: @product }
      else
        format.html { render action: "new" }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  else
   update ##*** I am calling the update action at this point ***##
  end
end

def update
  @product = Product.find_or_initialize_by_sku(params[:sku])

  respond_to do |format|
    if @product.update_attributes(params[:product])
      format.html { redirect_to @product, notice: 'Product was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end
end

@productしかし、あるアクションから別のアクションに変数 (この場合はインスタンス変数) を渡す最も効果的な方法がわからないため、データベースに対して 2 つの同一のクエリを作成することになります。

これを行うための「レール」の方法を理解しようとしています。ここで何をすべきですか (2 つの同一のデータベース クエリを作成するべきではないことがわかっているため)。

リダイレクトを実行しているかのようにセッションに保存しますか (このような別のアクション内からアクションを呼び出すときにリダイレクト実行していますか?)

session[:product] = @product # in my create action
# then
@product = session[:product] # in my update action

キャッシングはこれをすべて議論の余地のあるものにしますか?

4

1 に答える 1

3

memoization の使用を検討してください:

@product ||= Product.find_or_initialize_by_sku(params[:sku])

||=オペレーターは nil かどうかをチェックし、nilの@product場合、Ruby はファインダーを実行します。それ以外の場合、Ruby は現在の値を使用します。したがって、updateから呼び出すcreateと、updateメソッドは@productで見つけた、または で初期化した を使用しますcreate

2 番目の質問については、あるコントローラー アクションを別のコントローラー アクションから呼び出すときに、リダイレクトを実行していません。考えすぎないようにしてください。コントローラーは、独自のインスタンス変数 (例: @product) とメソッドを持つ別の Ruby クラスです。リダイレクトを実行するには、 を呼び出す必要がありますredirect_to。これにより、コントローラーへの 2 番目の Web 要求が発生します。

于 2012-12-16T07:19:47.070 に答える