(请注意,这些示例是我用例的简化。)
我有一个模型事件以及显示一个事件的默认路线:
/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可以通过简单的设置处理需求,那么它将允许我保持几乎所有其他代码不受影响。
修改
我发现,在功能测试FROM params
更改获取时get :show, id: @event
按预期保存了值(:id和:year){{1 }}
现在的问题是:
这只是这样做的方式还是我仍然支持get :show, id: @event.id
?
答案 0 :(得分: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