用于动态路由静态页面的Rails模板



我让我的Rails应用程序搜索pages文件夹,为每个文件夹创建路由,并在控制器中为它们生成方法。代码工作得很好!但是我无法让模板文件加载其中呈现的页面。下面是我的代码:

app/controllers/pages_controller.rb

class PagesController < ApplicationController
  attr_reader :pages_list
  def initialize
    PagesController.pages_list.each {|name|
      define_singleton_method(name) {}
    }
  end
  def self.pages_list
    Dir.glob(
        Rails.root + "app/views/pages/*"
    ).select {|f|
      File.file? f
    }.map {|f|
      File.basename(f)[0..File.basename(f).index(".").to_i-1]
    }.uniq
  end
end

config/routes.rb

PagesController.pages_list.each do |page|
  get "/#{page}", to: "pages##{page}", as: "#{page}_page"
end

我很高兴有工作路由与URL助手的任何页面我掉进去。但模板没有显示从app/views/layouts/application.html.erb

我在PagesController中尝试了以下操作:

include HighVoltage::StaticPage
layout :application
def initialize
  PagesController.pages_list.each {|name|
    define_singleton_method(name) {render layout: "application"}
  }
end

但是这对页面没有任何影响。感谢帮助!


视图是通用的锅炉板:

app/views/pages/contact.html.erb

<% content_for :title do %>Contact<% end %>
<h3>Contact info for the website</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>

app/views/pages/about.html.erb

<% content_for :title do %>About<% end %>
<h3>About the website</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>

与其为每个视图分别创建操作,不如为所有视图创建一个操作,这样不是更简单吗?

路线:

get '/:page', to: 'pages#show', as: :page

控制器:

class PagesController < ApplicationController
  def show
    render params[:page], layout: 'application'
  rescue ActionView::MissingTemplate
    raise ActionController::RoutingError, 'Not Found'
  end
end

事实证明,您不需要在控制器中定义每个方法来完成此操作。它通过从我的示例中删除我的initialize方法并添加一个布局选项来工作。

app/controllers/pages_controller.rb

class PagesController < ApplicationController
  attr_reader :pages_list
  layout "my_custom_layout"
  def self.pages_list
    Dir.glob(
        Rails.root + "app/views/pages/*"
    ).select {|f|
      File.file? f
    }.map {|f|
      File.basename(f)[0..File.basename(f).index(".").to_i-1]
    }.uniq
  end
end

config/routes.rb

PagesController.pages_list.each do |page|
  get "/#{page}", to: "pages##{page}", as: "#{page}_page"
end

即使控制器中没有定义同名的方法,也会调用右视图文件

最新更新