Rails渲染布局页面而不渲染视图?

21

我只是尝试用简单的Rails应用程序,主要是构建一个带有JSON的API后端和重量级客户端应用程序。所以我想做的就是仅呈现布局,并让JavaScript代码处理URL并进行Ajax请求以获取JSON数据。以下似乎有效:

respond_to do |format|
  format.html { render :nothing => true, :layout => true }
end

然而,由于没有意义的内容不应该被呈现出来,这样做感觉有点不对。有没有更合适的方法只呈现布局?请注意,我的布局中没有 yield。

6个回答

30

嗯,在 Rails 4.0 版本中,这对我起作用:

render :text => "", :layout => true

这似乎只是一种粗糙的渲染布局的方式,没有任何输入。 - Jay
7
这将在 Rails 5 中触发弃用警告。您可以使用 render html: '', layout: true 来实现相同的结果。 - Sebastian

20

(为了更好地展示 Vasile 的评论)

对于 Rails 5.1,如果要呈现布局而不需要视图模板,则需要使用

def index
  render html: '', layout: true
end

或使用自定义布局

def index
  render html: '', layout: 'mylayout'
end

根据tfwright的说法,这也可以工作:

def index
  render html: nil, layout: true
end

然而,以下内容将不起作用:

render text: '', layout: 'mylayout' 会给你一个错误,因为视图模板 index.html.haml 不存在。

render nothing: true, layout: 'mylayout' 会给你一个错误,因为 nothing:true 已被弃用,而且 index 模板不存在(然而,在 Rails 4.2 中有效)。

render body: '', layout: 'mylayout' 将呈现 ''(无布局)。

render plain: '', layout: 'mylayout' 将呈现 ''(无布局)。


使用Rails 5.1,这对我有效,而被接受的答案仅在我传递 layout: false 时有效,否则会使我的布局HTML渲染两次。而将一个空字符串替换为nil 作为html键也有效,这在我看来更清晰一些。 - tfwright

5
render :file => "layout_file", :layout => false

这也是一个有趣的选择。我想知道如果Rails不认为它是一个布局,是否会有什么缺点。 - agmcleod

4

我需要类似的东西 - 显示没有局部文件的布局模板(其中局部文件由客户端处理)。

rails 4.2.0

respond_to do |format|
  format.html { render text: nil, layout: true }
end

虽然这个答案可能是正确和有用的,但最好还是附上一些解释来说明它如何帮助解决问题。如果将来发生了变化(可能与此无关),导致它停止工作并且用户需要了解它曾经是如何工作的,这将特别有用。 - Kevin Brown-Silva

4
尝试这个,它将响应渲染到名为sample.html的文件中,该文件可以是静态HTML文件。
还可以在常见位置上拥有此文件,以便您可以将其加载到所有操作中。
在此页面上放置静态内容,如果需要动态页面,还可以有.erb页面。
在您的方法中。
def index
    @posts = Post.all

    respond_to do |format|
      format.html {render :file => "posts/sample"}
      format.json { render json: @posts }
    end
end

/post/sample.html

HTH


我的担忧是返回不必要的数据。我也考虑过使用 :text => "" 作为一个选项,但是默认情况下它只渲染文本,你还需要使用 :layout => true - agmcleod
你能否创建一个空的静态HTML页面并添加一条消息(或其他内容),或者你能解释一下用户在执行此操作时需要看到什么!(或者将所有CSS和JS放入静态文件中,而不使用布局) - sameera207
那也可以 :). 我的一位同事也建议使用Sinatra来完成前端方面的工作,让Rails成为纯API。 - agmcleod

0
我认为如果你的应用程序只是从服务器获取JSON数据,那么格式应该是json而不是html
respond_to do |format|
  format.json @your_collection
end

或者在您的控制器中为所有操作设置格式,然后只需使用对象进行响应。

问题在于如何响应普通URL。我不想复制Haml和JST视图。假设我有一个简单的博客和一个帖子控制器。所以要直接访问帖子,你需要去/posts/1。那么它需要做的就是呈现布局。如果我只是用JSON回应,而没有为HTML回应说些什么,那么/posts/1会抛出模板错误。 - agmcleod
嗯,我以为你会只用JavaScript处理DOM代码。比如根据服务器返回的JSON替换HTML。 - MurifoX
你可以这样做。但是,当尝试通过链接点击等方式替换内容时,情况会变得更加棘手。当应用程序变得越来越大时,它变得更加复杂。我正在努力摆脱这种思维方式,并通过这种风格进行一些实践,以便将这个应用程序发展成为一个更好的东西。 - agmcleod
我不确定你的应用基础设施,但我建议你看一下现在很多的新兴JavaScript MVC框架(如Backbone.js、Ember.js、Angular.js)。它们中的大多数与Rails有很好的交互,可能可以让这种任务更容易。 - MurifoX
是的,这就是我正在做的事情。只是没有提到它,因为它并不会真正影响问题。我已经在普通的rails g scaffold之上使用了像rails backbone这样的东西,效果还不错。我只是不想要双重视图,我想看看这个实验的结果如何 :D - agmcleod
哦,我明白了 xD。那么,我的意见对你并没有太大帮助。 - MurifoX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接