我有这个设置:
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_with
或respond_to
和inherited_resources?
答案 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
:)