1

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

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

/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]仍然是1params[:year]应该是2012

Rails 是否提供了一种标准的方法来实现这一点?

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

这样的方法会很快实现,但如果 R​​ails 可以通过简单的设置来处理需求,它可以让我几乎所有其他代码都保持不变。

编辑:

我发现在将功能测试中的get更改为FROM TOparams时,我的值(:id 和 :year)符合预期。get :show, id: @eventget :show, id: @event.id

现在的问题是:

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

4

1 回答 1

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
于 2012-03-14T13:27:40.070 回答