1

(例は私のユースケースを単純化したものであることに注意してください。)

モデルイベントと、1つのイベントを表示するためのデフォルトルートがあります。

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

現在、イベントにはyearという名前の属性があり、私はすでに次のルートも受け入れています。

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

2番目のバリアントがデフォルトになるため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になりたいのですが、 2012年params[:year]になるはずです。

Railsはこれを達成するための標準的な方法を提供しますか?

...または、モデルのカスタムメソッドを記述し、次のようなものを発行して呼び出す必要がありますか?redirect_to @event.custom_method_to_create_long_url_variant

このようなメソッドはすぐに実装されますが、Railsが単純な設定で要件を処理できる場合は、他のほとんどすべてのコードをそのままにしておくことができます。

編集:

機能テストのgetをFROMTOparamsに変更すると、期待どおりに値(: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 に答える