我在rails上遇到静态页面策略问题。
我有一个处理静态页面的控制器。基本上,它会读取app/views/static
目录中的模板并按要求进行渲染。像这样:
class StaticController < ApplicationController
def show
templ = File.join(params[:controller], params[:page])
puts params, templ
render templ
rescue ActionView::MissingTemplate => e
if e.message =~ %r{Missing template #{templ}}
raise ActionController::RoutingError, 'Not Found'
else
raise e
end
end
end
这些是我的路线:
Rails.application.routes.draw do
root 'static#show', page: 'home'
get ':page', to: 'static#show', as: :static, constraints: { page: /a-zA-Z\-_\/+/ }
end
根路由工作正常,我能够很好地访问视图。我没有错。 现在,在我的标题部分,我有这个,编辑为简单/相关性:
<%= link_to('Home', static_path(:home)) %>
部分或主模板中没有其他ruby代码。我不确定我做错了什么。这个错误没有意义。
ActionController::UrlGenerationError - No route matches {:action=>"show", :controller=>"static", :format=>nil, :page=>:home} missing required keys: [:page]
缺少所需密钥的确切位置?我没有任何其他对象或模特。
现在这很好用:
<%= link_to('Home', controller: 'static', action: 'show', page: 'home') %>
那么我如何使static_path像这样工作呢?
感谢。
答案 0 :(得分:1)
我认为使用约束的正则表达式存在问题,我建议将其从路径定义中删除,因为您已经检查控制器中是否存在模板。
另外,你应该看看high_voltage gem,它可以很好地处理创建静态页面。
答案 1 :(得分:0)
我的第一个猜测是:
<%= link_to 'Home', static_path("home") %> #-> try passing a string, rather than symbol
此应该允许您引用所需的路径
-
class StaticController < ApplicationController
def show
templ = File.join(params[:controller], params[:page])
puts params, templ
render templ
rescue ActionView::MissingTemplate => e
if e.message =~ %r{Missing template #{templ}}
raise ActionController::RoutingError, 'Not Found'
else
raise e
end
end
end
我个人会让这更简单:
class StaticController < ApplicationController
def show
render "pages#{params[:page]}
end
end