是否有必要在资源控制器`#create`方法中设置实例变量?

时间:2016-09-13 10:27:08

标签: ruby-on-rails

使用以下控制器获得资源Foobar

class FoobarController < ApplicationController
  def new
    @foobar = Foobar.new(baz: params[:baz])
    @foobar.build_data
  end

  def create
    @foobar = Foobar.new(foobar_params)
    respond_with(@foobar)
  end

  # ...
end

是否有必要在@foobar方法中设置实例变量#create?我不能写

def create
  Foobar.new(foobar_params).tap &method(:respond_with)
end

1 个答案:

答案 0 :(得分:2)

这取决于您回复的内容类型。 {{3}}准确描述了致电respond_with时会发生什么。在您的情况下,在create操作中,respond_with与以下内容相同,假设您未在控制器的respond_to调用中指定除html之外的任何其他格式:

respond_to do |format|
  if @foobar.save
    flash[:notice] = 'Foobar was successfully created.'
    format.html { redirect_to(@foobar) }
  else
    format.html { render action: "new" }
  end
end

唯一需要@foobar实例变量的情况是,如果存在验证错误且您的new.html模板包含@foobar。如果foobar_params始终有效,则respond_with将始终以show操作的重定向进行响应,因此不需要实例变量。