Rails 4默认为ajax控制器的respond_to

时间:2014-11-08 21:40:32

标签: ruby-on-rails

我有一个rails控制器,每个动作对每个动作都有相同的respond_to块,例如:

def some_action
  respond_to do |format|
    format.html { redirect_to :back }
    format.js   { render layout: false }
  end
end 

有没有办法可以将其设置为所有操作的默认响应?我知道我可以使用

respond_to :html, :js

位于控制器的顶部,但是这可以用于设置每种格式的特定响应吗?

2 个答案:

答案 0 :(得分:1)

通过respond_withrespond_to文档和源代码。你可以

使用respond_to

def create
  @user = User.new(params[:user])
  respond_to do |format|
    if @user.save
      flash[:notice] = 'User was successfully created.'
      format.html { redirect_to(@user) }
      format.xml { render xml: @user }
    else
      format.html { render action: "new" }
      format.xml { render xml: @user }
    end
  end
end

respond_with

respond_to :html, :xml

def create
  @user = User.new(params[:user])
  flash[:notice] = 'User was successfully created.' if @user.save
  respond_with(@user)
end

解决方法是创建自己的自定义respond方法,或手动检查mime类型,如下所示:

****注意:这是一个非常糟糕的做法,我建议坚持惯例。

def some_action
  render json: {"a" => "s"} if request.format.json? 
  render :some_action if request.format.html? 
end

答案 1 :(得分:0)

如果您希望所有操作都完全相同,请将respond_to块移动到方法中。

def some_action
  # do things
  respond
end 

def another_action
  # do more things
  respond
end

def special_action
  # do special things
  respond
end

private

def respond
  respond_to do |format|
    format.html { redirect_to :back }
    format.js   { render layout: false }
  end
end

这会干掉你的控制器,我认为这是个问题。