我应该在哪里放置respond_to块?

时间:2011-01-09 12:34:42

标签: ruby-on-rails ruby-on-rails-3

假设我有一个ArtcilesController,其创建动作如下。

def create
  @article = Article.new(params[:article])

  respond_to do |format|
    if @article.save
      format.html { redirect_to(@article, :notice => "Article created") }
      format.json { render :show }
    else
      format.html { render :new }
      format.json { render(:json => { :errors => @article.errors }, :status => :not_acceptable) }
    end
  end
end

同样的行动也可以写成如下:

def create
  @article = Article.new(params[:article])

  if @article.save
    respond_to do |format|
      format.html { redirect_to(@article, :notice => "Article created") }
      format.json { render :show }
    end
  else
    respond_to do |format|
      format.html { render :new }
      format.json { render(:json => { :errors => @article.errors }, :status => :not_acceptable) }
    end
  end
end

请注意,在第一个示例中,在respond_to块内部有一个if else块,第二个,在一个if else块中有两个respond_to块。

我应该比其他人更喜欢吗?如果是的话,有什么原因吗?或者只是选择一种风格并坚持下去?

2 个答案:

答案 0 :(得分:3)

仅限样式,但是您只响应一个请求并根据您的模型在控制器中使用路由逻辑。

def create
  @article = Article.new(params[:article])
  respond_to do |format|
    format.html { 
     @article.save ? redirect_to(@article, :notice => "Article created") : render :new
    }
    format.json { 
       @article.save ? render(:show) : render(:json => { :errors => @article.errors }, :status => :not_acceptable)
    }
  end
end

答案 1 :(得分:0)

对于如上所述的样板代码,Rails 3中的

respond_with会干掉它。它甚至在验证失败时处理渲染编辑/新表单和错误消息。