【问题标题】:Rails rendering layout only?仅 Rails 渲染布局?
【发布时间】:2018-08-03 02:28:03
【问题描述】:

只是尝试一个简单的 Rails 应用程序,主要用于带有 JSON 的 API 后端、重型客户端应用程序。所以我想做的只是渲染布局,让javascript代码处理url,并发出ajax请求来获取json数据。以下似乎有效:

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

但是,由于没有什么是不渲染的,所以感觉有点不对劲。有没有更合适的方法来渲染布局?请注意,我的布局没有产量。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    嗯,这在 Rails 4.0 中对我有用:

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

    【讨论】:

    • 这似乎只是一种无需输入即可呈现布局的 hacky 方式
    • 这将在 Rails 5 中引发弃用警告。您可以使用render html: '', layout: true 来获得相同的结果。
    【解决方案2】:

    (复制 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 键也有效,这对我来说似乎更干净。
    【解决方案3】:
    render :file => "layout_file", :layout => false
    

    【讨论】:

    • 这也是一个有趣的选择。我想知道 rails 不认为它是布局是否有缺点。
    【解决方案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,因为默认情况下它只呈现文本。
    • 你不能有一个带有消息(或其他东西)的空白静态 html 页面,或者你能解释一下用户在点击这个动作时需要看到什么! (或者将所有的 css 和 js 都放在静态文件中,完全不使用布局)
    • 这也可以:)。我的一个同事也建议在 sinatra 中做前端方面,并让 rails 成为纯 API。
    【解决方案5】:

    我需要类似的东西——显示一个没有部分的布局模板(部分在客户端处理)。

    rails 4.2.0

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

    【讨论】:

    • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
    【解决方案6】:

    我相信如果您的应用程序只是从服务器获取 JSON,格式应该是 json 而不是 html

    respond_to do |format|
      format.json @your_collection
    end
    

    或者将所有动作的格式放在你的控制器中,然后用对象来响应。

    【讨论】:

    • 问题在于响应常规 URL。我不想复制 haml 和 JST 视图。假设我有一个带有帖子控制器的简单博客。因此,要直接访问帖子,您可以转到 /posts/1。所以这需要做的是渲染布局。如果我只是用 JSON 响应,而我没有对 html 响应说什么,那么/posts/1 会抛出一个模板错误。
    • 嗯,我认为你只用 javascript 就可以处理 DOM 代码。就像根据服务器的json替换html一样。
    • 你可以。但是,当尝试通过链接点击替换内容时,它变得更加棘手。当应用程序变大时,它会变得复杂。我试图绕过这种心态,并用这种风格进行一些练习,这样我就可以把这个应用程序发展成一些东西。
    • 我不确定您的应用程序基础架构,但我建议您看看最近流行的新的和大肆宣传的 Javascripts MVC 框架。 (Backbone.js、Ember.js、Angular.js)。他们中的大多数都与 Rails 有很好的交互,可能会使这种任务更容易。
    • 是的,我就是这么做的。只是没有提到它,因为它并没有真正影响这个问题。我在常规的rails g scaffold 上使用了诸如 rails 主干之类的东西,效果很好。我只是不想要双重视图,我想看看这是如何作为一个实验进行的:D
    猜你喜欢
    • 2010-11-10
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多