我的一些客户希望为Rails中的某些页面创建别名。这种别名的示例如下所示:
match '/events_nl' => 'pages#show', :defaults => { :id => '1' , :locale => "nl"}我们使用的是rails管理,所以如果我创建一个带有字段的表,以便手动创建别名,该怎么办:
有些模型在表中已经有一个别名,让我们称其为模型页。模型页有一个字段别名,是否可以在路由中这样做:
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,比如这样做的方式。
发布于 2014-06-13 07:35:48
在我亲爱的朋友七星的帮助下,一切都进行得很好:
我做了什么:
1)将所需的别名字段/列添加到表中
2)创建了别名模型/控制器--这段代码是伪代码,但您将得到图片
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
end3)创建了路由
get '*alias', to: 'alias#show', as: 'alias'仅供参考not_found:
def not_found
raise ActionController::RoutingError.new(t("activemodel.errors.messages.not_found"))
endNote 1
这没有交叉表验证。
谢谢大家的帮助:)
发布于 2014-06-12 13:39:23
实现此操作的典型方法是在路由文件末尾使用通配符路由,如下所示:
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])等等.当您找到匹配的视图时,就可以呈现适当的视图。
当然,如果您这样做,您将面临命名冲突的风险--如果您有一个具有相同别名的证词和页面,会发生什么?一个将永远不会被看到,因为另一个将被查找和匹配第一。
发布于 2014-06-12 14:11:38
未经测试,但这样的东西应该可以工作(如果您不介意重定向,从某些方面来说,这似乎更好):
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!作为对模型的观察的一部分,但这似乎不那么清晰。
https://stackoverflow.com/questions/24185641
复制相似问题