我的一些客户想为 Rails 中的某些页面创建别名。下面显示了这种别名的示例:
match '/events_nl' => 'pages#show', :defaults => { :id => '1' , :locale => "nl"}
我们正在使用 rails admin,所以如果我创建一个包含用于手动创建别名的字段的表会怎么样:
- 别名
- 控制者
- 编号
- 语言环境
一些模型在表中已经有了一个别名,我们称它为模型页面。模型页面有一个字段别名是否可以在路由中做这样的事情:
pages_with_alias = Page.find_all_by_alias(true)
pages_with_alias.each do page
match page.alias , :to "pages#show", :defaults => { :id => page.id , :locale => page.locale}
end
问题: 我只是在寻找最像 rails 的方式来做到这一点。
最佳答案
执行此操作的典型方法是在路由文件末尾使用通配符路由,例如:
get '*alias', to: 'pages#show', as: :page
其中,对于不匹配任何其他路由的任何 URL,将使用 alias
参数中的路径调用您的 PagesController 的显示操作。
然后在 show Action 中,你可以做一个 Page.find_by_alias!(params[:alias])
- 如果没有匹配的页面,你会得到一个标准的 404 页面(因为 ActiveRecord::RecordNotFound
异常将被抛出),如果该页面确实存在,那么您可以照常继续。
编辑:
对于您想要像这样使用别名的多个模型,您可以将通配符指向不同的 Controller ,然后在该 Controller 中遍历您的模型以寻找匹配的模型。例如。首先是 Page.find_by_alias(params[:alias])
.... 如果它是 nil,然后是 Testimonial.find_by_alias(params[:alias])
,等等... . 当你找到一个匹配的,你就可以渲染合适的 View 。
当然,如果您这样做,就会冒命名冲突的风险 - 如果您的 Testimonial 和 Page 具有相同的别名,会发生什么情况?一个将永远不可见,因为另一个将首先被查找和匹配。
关于ruby-on-rails - 在 Rails 3 中动态创建路由别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24185641/