我让我的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
即使控制器中没有定义同名的方法,也会调用右视图文件