如何让默认资源路由包含模型的属性?

Posted

技术标签:

【中文标题】如何让默认资源路由包含模型的属性?【英文标题】:How can I have the default resourceful route include attributes of my model? 【发布时间】:2012-03-14 10:57:08 【问题描述】:

(请注意,这些示例是对我的用例的简化。)

我有一个模型事件和显示一个事件的默认路由:

/events/:id(.:format) ----> activities#show

现在,该事件有一个名为 year 的属性,我也已经接受以下路线:

/events/:year/:id(.:format) ----> activities#show

由于第二个变体应为默认值,我希望像 redirect_to @event 这样的代码将用户引导至该变体(例如 http://localhost:3000/events/2012/1)。

我在哪里定义它?

到目前为止,我已经尝试像这样覆盖模型中的to_param

def to_param
  "#self.year/#self.id"
end

...但这会导致params[:id] 被字符串 2012/1 填充。

我希望params[:id] 仍然是1,而params[:year] 应该是2012

Rails 是否提供标准方法来完成此任务?

...或者我是否必须为模型编写一个自定义方法并通过发出如下内容来调用它:redirect_to @event.custom_method_to_create_long_url_variant

这样的方法会很快实现,但是如果 Rails 可以通过简单的设置来处理这个需求,那么我就可以让几乎所有其他代码保持不变。

编辑:

我发现我的params 在将功能测试中的getget :show, id: @event 更改为get :show, id: @event.id 时按预期保留了值(:id 和:year)。

现在的问题是:

这只是这样做的方式还是我仍然可以支持get :show, id: @event

【问题讨论】:

【参考方案1】:

类似这样的东西:

match "/events(/:year)/:id(.:format) => "activities#show"

进入你的控制器

Started GET "/events/2012/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: "year"=>"2012", "id"=>"12"

或没有年份

Started GET "/events/12" for 127.0.0.1 at 2012-03-14 17:25:44 +0400
Parameters: "id"=>"12"

所以,你可以在你的控制器中使用

params[:id]
params[:year]

还有 url_helper

match "/events(/:year)/:id(.:format) => "activities#show", :as => :my_event

my_event_path(2012, 12) #=> /eventes/2012/12
my_event_path(@event.id) #=> /events/12

【讨论】:

以上是关于如何让默认资源路由包含模型的属性?的主要内容,如果未能解决你的问题,请参考以下文章

在 URL 中自动使用模型属性生成路由

如何使用包含模型中的属性来创建 where 条件?

如何在rails中保存包含另一个模型属性的模型?

WPF 如何找到资源文件路径包含 # 号的文件

如何基于模型类的属性创建一组控件

使用 asp.net 属性路由的根路径的默认路由