【问题标题】:Rails 4: applying different layouts to specific controller actionsRails 4:将不同的布局应用于特定的控制器操作
【发布时间】:2016-04-11 06:38:18
【问题描述】:

在我的 Rails 4 应用程序中,我有一个 PagesController,具有 app/views/layouts/pages.html.erb 布局。

两个页面需要特定的布局:homehelp

要将特定布局应用于home,我执行了以下操作:

class PagesController < ApplicationController
  def home
    render :layout => 'homepage'
  end
end

我有一个特定的主页布局:app/views/layouts/homepage.html.erb

这很好用。

然后,我尝试将这个过程复制到帮助页面:

class PagesController < ApplicationController
  def home
    render :layout => 'homepage'
  end
  def help
    render :layout => 'helppage'
  end
end

我有一个特定的帮助页面布局:app/views/layouts/helppage.html.erb

但是,帮助页面没有采用所需的布局。

我的代码有问题吗?

————

更新:根据 Adrian Mann 的要求,这是我完整的PagesController

class PagesController < ApplicationController

  before_action :authenticate_user!, :only => [:help]

  def home
    [...]
    render :layout => 'homepage'
  end

  def features
  end

  def pricing
  end

  def about
  end

  def contact
  end

  def feedback
  end

  def press
  end

  def help
    render :layout => 'helppage'
  end

  def privacy
  end

  def terms
  end

  def career
  end

  def help
  end

  def faq
  end

  def guides
  end

  def support
  end

  def investors
  end

end

这是我的ApplicationController

class ApplicationController < ActionController::Base

  # include Pundit

  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  # after_action :verify_authorized, :except => :index

  def after_sign_in_path_for(resource)
    sign_in_url = new_user_session_url
    if request.referer == sign_in_url
      super
    else
      stored_location_for(resource) || request.referer || root_path
    end
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :company_name, :email, :password, :password_confirmation, :time_zone, :company_type, :expert, :expert_approval, :category, :description, :portfolio, :price, :avatar, :first_reference, :second_reference, :third_reference, :location) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :company_name, :email, :password, :current_password, :password_confirmation, :time_zone, :company_type, :expert, :expert_approval, :category, :description, :portfolio, :price, :avatar, :first_reference, :second_reference, :third_reference, :location) }
  end

  def user_for_paper_trail
    user_signed_in? ? current_user.try(:id) : "Unknow User"
  end

  def facebook_copy_link(string)
    require "uri"
    array = URI.extract(string.to_s)
    array.select { |item| item.include? ( "http" || "www") }.first
  end

end

【问题讨论】:

  • 您能否发布您的完整应用程序控制器文件和您的完整页面控制器?
  • 当然。请参阅问题中的 UPDATE 部分。感谢您的帮助。
  • nit-pick:不要在方法中添加要求。 :)

标签: ruby-on-rails templates ruby-on-rails-4 layout


【解决方案1】:

尝试以下操作,注意已删除的render

class PagesController < ApplicationController

  def home
    layout "homepage"
  end
  def help
    layout "helppage"
  end
end

或者:

class PagesController < ApplicationController
  layout "homepage", only: [:home]
  layout "helppage", only: [:help]

  def home
  end

  def help
  end
end

elsewhere所述:

render 方法实际上会尝试渲染内容;你 当您只想设置布局时不应该调用它。

【讨论】:

  • 感谢您的回答。不幸的是,这给了我以下错误:syntax error, unexpected ':', expecting keyword_end layout: 'homepage'.
  • @ThibaudClement 抱歉,我已经编辑了问题,删除了: 并稍微扩展了我的答案。请尝试上面的编辑。
【解决方案2】:

我在您的代码中没有发现任何问题。您看到 help 操作的哪种布局?可以试试layout false吗?

class PagesController < ApplicationController
  layout false

  def home
    render :layout => 'homepage'
  end
  def help
    render :layout => 'helppage'
 end

结束

【讨论】:

  • 感谢您的回答。我为help 操作获得的布局是我为控制器的所有其他操作构建的通用布局。当我尝试layout false 时,我得到了相同的结果
  • 我还尝试将 helppage.html.erb 重命名为 xyz.html.erb 以防命名约定导致某种错误,但它没有改变任何东西。
  • 如果您对help 使用homepage 布局会发生什么?也许帮助页面布局本身存在一些代码问题。
  • 好主意。刚刚尝试使用主页布局。但结果相同:应用了一般布局。这表明问题可能不是来自布局本身,而是来自render 方法,不是吗?
  • 我可能已经找到了问题的根本原因。如果我将帮助页面布局应用于控制器中的任何其他操作,它就可以工作。所以我试图了解help 动作的独特之处,并意识到我的控制器中有before_action :authenticate_user!, :only =&gt; [:help]。这会阻止布局被渲染吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2016-10-13
  • 2010-11-29
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多