ruby-on-rails - 在 Rails 3 中动态创建路由别名

标签 ruby-on-rails ruby ruby-on-rails-3 alias rails-routing

我的一些客户想为 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/

相关文章:

css - 单击 ruby​​ 中的链接(已通过 css 找到)

python - 如何从 Ruby 调用 Python 代码?

ruby - 如何为网站应用程序设置 $Display 变量?

jquery - 如何在 Rails 中使 Ajax 请求失败?

ruby - 如何对 Resque 执行方法或 Resque Job 类进行基准测试?

ruby-on-rails - 语法错误,意外的keyword_or范围

javascript - 使用 JQuery 在 TextField 中显示信用卡品牌

ruby-on-rails - 批量插入 rails 3

ruby-on-rails - Model.count 和 Model.count 之间的 Rails 差异(:all)

ruby-on-rails - 在没有外部 SMTP 服务的情况下发送电子邮件