条件to_param方法

Mar*_*ark 6 routes models ruby-on-rails-3

我使用模型实例方法t_param来生成SEO样式的URL

def to_param
  url
end
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用path_to_model(model)生成到模型的链接,并使用Model.find_by_url(url)查询模型.这到目前为止工作正常.

我的问题:我有后端的RESTFUL管理路由.我可以以某种方式使to_param方法对它所调用的路由作出反应吗?因为我想在后端使用ID参数而不是URL参数创建链接.或者这里的正确方法是什么?

ace*_*des 3

我遇到过同样的问题。模型确实不能/不应该了解有关控制器的任何信息。控制器的工作是确定正在请求什么资源,并调用模型来访问它。如果您的 AdminController 需要使用标准数字 ID,您就不会想要触摸to_param.

事实证明,解决方案非常简单,我在生产中使用了它。

假设您已经为控制器命名了,您将拥有一个 MyModelController 和一个 Admin::MyModelController 以及它们的助手。在管理中,以标准方式做事。在 MyModelController 中,执行以下操作:

在您的资源操作中,引用它params[:id],但将其视为永久链接 (URL)。例如

def get
  @my_model = MyModel.find_by_url(params[:id])
  ...
end
Run Code Online (Sandbox Code Playgroud)

在你的 MyModelHelper 中

def my_model_path my_model
  super my_model.url
end

def my_model_url my_model
  super my_model.url
end
Run Code Online (Sandbox Code Playgroud)

对我来说,感觉这是“不与轨道冲突”并完成我需要完成的事情的最佳方式。

可能有一种更聪明的方法来覆盖命名路由。另外我认为你不能使用helper :all这种方法,除非你在生成路径/url 之前检查你是否处于管理员状态。