Определение: id в маршрутах должен быть чем-то отличным от id в rails 3 - PullRequest
3 голосов
/ 29 сентября 2010

Я портирую приложение Merb на Rails 3. В Merb мы могли бы поместить блок Identify вокруг маршрута, чтобы определить, как должен быть предоставлен параметр маршрута: id, например,

# this is a Merb route that I want to port to Rails 3 routing; I get everything except 
# how to replicate the behavior of Merb's Identify block which doesn't require one to 
# futz with overriding to_param on user; a user instance gets passed to the url builder
# ala url(:edit_password_reset, user) and this tells the router to use the 
# reset_password_token method on user to supply the :id value for this one route
Identify User => :reset_password_token do
  match("/reset-password/:id", :method => :get).to(:controller => "password_resets", :action => "edit").name(:edit_password_reset)
end

# and then later define more routes that use the user's id without a problem 
# since to_param was not overridden on user; here I have already translated to 
# Rails 3 and this works fine
controller :users  do
  get "/register", :action => "new", :as => "new_user"
  get "/users", :action => "index", :as => "users"
  get "/users/:id", :action => "show", :as => "show_user"
  get "/users/:id/edit", :action => "edit", :as => "edit_user"
  put "/users/:id", :action => "update", :as => "update_user"
  post  "/users", :action => "create", :as => "create_user"
end

В Rails, как и в Merb, вы можете переопределить to_param для предоставления альтернативного значения идентификатора для маршрутов, но для случая, когда один раз вы хотите использовать идентификатор, а другой раз вы хотите использовать другой метод для того же объекта (как указано выше), Идентифицировать удобно. Что такое эквивалент Rails 3? Я просмотрел исходные тексты и тесты Rails 3 и не увидел ничего эквивалентного идентификатору. Я пропустил это?

Я могу реорганизовать вещи и, возможно, в этом случае они мне не понадобятся, но все же я хотел бы знать, пропустил ли я что-то.

Спасибо.

1 Ответ

1 голос
/ 16 августа 2011

Я столкнулся с той же проблемой;Оказывается, лучший способ - полностью пропустить to_param при вызове URL или пути.Например:

# This will set params[:id] to @user.to_param
edit_password_reset_url(@user)

# This will set params[:id] to @user.reset_password_token
edit_password_reset_url(@user.reset_password_token)

Другими словами, to_param вызывается только при передаче записи помощникам URL;если вы передадите ей строку, она просто проанализирует строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...