【问题标题】:How do I specify ":layout => false" in Rails' respond_with?如何在 Rails 的 respond_with 中指定“:layout => false”?
【发布时间】:2014-05-12 15:26:32
【问题描述】:

我有这个设置:

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 =&gt; false, :text =&gt; @users.to_json。如何使用respond_with 或respond_to 和inherited_resources 做到这一点?

【问题讨论】:

  • 只是猜测,但也许render false ?

标签: ruby-on-rails


【解决方案1】:

类似:

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

【讨论】:

    【解决方案2】:

    假设您需要 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
    

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

    【讨论】:

      【解决方案3】:

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

      如果您在此控制器中没有任何操作的布局,最好这样做:

      class UsersController < InheritedResources::Base
        respond_to :html, :js, :xml, :json
        layout false
      
        def index
          @users = User.all
          respond_with(@users)
        end
      end
      

      【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        我刚刚发现了这个:

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

        解决方案:制作 JSON 布局。

        例如,如果您在 HTML 旁边放置一个空的 application.json.erb 和一个 = yield,则 HTML 布局会比 JSON 布局更好。你甚至可以用它来用元数据或类似的东西包围你的 JSON。

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

        不需要其他参数,它会自动运行!

        仅在 Rails 4 中测试

        【讨论】:

        • 在 Rails 3 中测试,运行良好。虽然它不是所提问题的答案,但它仍然是我们很多人真正的意思的问题的答案。
        • 在 Rails 4 中为我工作。简单明了。
        • 我刚刚签入了 Rails 4.2。如果您将布局文件命名为application.html.slim,则不会将其视为 json 的布局文件;不管是谁,如果您将布局文件命名为 application.slim.. 那么它将被视为 JSON 的布局文件。 (用erb替换slim应该做同样的事情)。
        【解决方案6】:
        class UsersController < InheritedResources::Base
          layout -> (controller) { controller.request.xhr? ? false : 'application' }
        end
        

        【讨论】:

          【解决方案7】:

          你需要在你的表演动作中设置这个。

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

          :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多