如何在Rails的respond_with中指定“:layout => false”?

时间:2010-10-06 21:06:16

标签: ruby-on-rails

我有这个设置:

class UsersController < InheritedResources::Base
  respond_to :html, :js, :xml, :json

  def index
    @users = User.all
    respond_with(@users)
  end
end

现在我正试图这样做,如果params[:format] =~ /(js|json)/render :layout => false, :text => @users.to_json。如何使用respond_withrespond_to和inherited_resources?

执行此操作

7 个答案:

答案 0 :(得分:44)

类似的东西:

def index
  @users = User.all
  respond_with @users do |format|
    format.json { render :layout => false, :text => @users.to_json }
  end
end

答案 1 :(得分:28)

假设您需要JSON用于Ajax请求

class UsersController < InheritedResources::Base
  respond_to :html, :js, :xml, :json

  def index
    @users = User.all
    respond_with(@users, :layout => !request.xhr? )
  end
end

这对我来说似乎是最干净的解决方案。

答案 2 :(得分:18)

或者为了防止您必须对每个操作中的每种格式进行硬编码。

如果您没有此控制器中任何操作的布局,那么更好:

class UsersController < InheritedResources::Base
  respond_to :html, :js, :xml, :json
  layout false

  def index
    @users = User.all
    respond_with(@users)
  end
end

答案 3 :(得分:8)

我喜欢@ anthony的解决方案,但对我不起作用......我必须这样做:

respond_with(@users) do |format|
  format.html { render :layout => !request.xhr? }
end

ps:发布“回答”而不是评论,因为stackoverflow评论格式和“返回键==提交”令人愤怒!

答案 4 :(得分:4)

我刚刚发现了这个:

即使它是JSON,Rails仍在寻找布局。因此,在我们的示例中,它找到的唯一布局是application.html

解决方案:制作JSON布局。

因此,举例来说,如果你将一个空application.json.erb放在一个= yield里面,在你的HTML旁边,那么HTML布局就更好了。您甚至可以使用它来围绕JSON包含元数据或类似内容。

<%# app/views/layouts/application.json.erb %>

<%= yield %>

不需要其他参数,它会自动生效!

仅在Rails 4中测试

答案 5 :(得分:3)

class UsersController < InheritedResources::Base
  layout -> (controller) { controller.request.xhr? ? false : 'application' }
end

答案 6 :(得分:1)

您需要在节目动作中设置此项。

def show
  render :layout => !request.xhr?
end

:)