首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails 3中动态创建路由别名

问在Rails 3中动态创建路由别名
EN

Stack Overflow用户
提问于 2014-06-12 13:27:02
回答 3查看 649关注 0票数 1

我的一些客户希望为Rails中的某些页面创建别名。这种别名的示例如下所示:

代码语言:javascript
复制
match '/events_nl' => 'pages#show', :defaults => { :id => '1' , :locale => "nl"}

我们使用的是rails管理,所以如果我创建一个带有字段的表,以便手动创建别名,该怎么办:

  • 别名
  • 控制器
  • id
  • 区域设置

有些模型在表中已经有一个别名,让我们称其为模型页。模型页有一个字段别名,是否可以在路由中这样做:

代码语言:javascript
复制
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,比如这样做的方式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-13 07:35:48

在我亲爱的朋友七星的帮助下,一切都进行得很好:

我做了什么:

1)将所需的别名字段/列添加到表中

2)创建了别名模型/控制器--这段代码是伪代码,但您将得到图片

代码语言:javascript
复制
  def show
    object = Model.where("lower(alias) =?", params[:alias].downcase).first || OtherModel.where("lower(alias) =?", params[:alias].downcase).first
    if object.class.name == "Model"
      @model = Model.find_by_id!(object.model_id)
      render "model/show"
    elsif object.class.name == "OtherModel"
      @othermodel = OtherModel.find_by_id!(object.othermodel_id)

      I18n.locale = object.locale
      render "othermodel/show"
    else
      not_found
    end
  end

3)创建了路由

代码语言:javascript
复制
get '*alias', to: 'alias#show', as: 'alias'

仅供参考not_found:

代码语言:javascript
复制
  def not_found
    raise ActionController::RoutingError.new(t("activemodel.errors.messages.not_found"))
  end

Note 1

这没有交叉表验证。

谢谢大家的帮助:)

票数 1
EN

Stack Overflow用户

发布于 2014-06-12 13:39:23

实现此操作的典型方法是在路由文件末尾使用通配符路由,如下所示:

代码语言:javascript
复制
get '*alias', to: 'pages#show', as: :page

对于不匹配任何其他路由的任何URL,都将使用alias参数中的路径调用PagesController的显示操作。

然后,在show操作中,您可以执行一个Page.find_by_alias!(params[:alias]) --如果没有匹配的页面,您将得到一个标准的404页(因为将抛出一个ActiveRecord::RecordNotFound异常),如果页面确实存在,则可以继续正常运行。

编辑:

对于您想要这样别名的多个模型,您可以将通配符指向不同的控制器,然后在该控制器中迭代您的模型,寻找匹配的模型。例如:第一Page.find_by_alias(params[:alias])..。如果是零,那么Testimonial.find_by_alias(params[:alias])等等.当您找到匹配的视图时,就可以呈现适当的视图。

当然,如果您这样做,您将面临命名冲突的风险--如果您有一个具有相同别名的证词和页面,会发生什么?一个将永远不会被看到,因为另一个将被查找和匹配第一。

票数 2
EN

Stack Overflow用户

发布于 2014-06-12 14:11:38

未经测试,但这样的东西应该可以工作(如果您不介意重定向,从某些方面来说,这似乎更好):

代码语言:javascript
复制
get '*alias', to: redirect { |params, request| 
  object = Page.find_by_alias(params[:alias]) || Other.find_by_alias(params[:alias])
  Rails.application.routes.url_helpers.url_for(object)
}

如果您不需要动态更新路由(例如,您的解决方案在重新启动应用程序之前不会为新创建的对象提供路径),那么您的方法可能更好一些。您可以调用Rails.application.reload_routes!作为对模型的观察的一部分,但这似乎不那么清晰。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24185641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档