#ruby-on-rails #ruby #rest #routing
#ruby-on-rails #ruby #rest #маршруты
Вопрос:
На части моего веб-сайта есть англо-французский словарь. Я хочу, чтобы URL был site.com/dictionary/:word . Однако для ссылки на одну запись можно использовать несколько слов, потому что есть английское слово, французское слово и мужские / женские версии слова.
Я смог заставить это работать в Rails 3, используя следующий код.
# routes.rb
match 'dictionary/:word' => 'dictionary#show'
match 'dictionary' => 'dictionary#index', :as => :dictionary
# dictionary_controller.rb
def show
@word = Dictionary.find( :first,
:conditions => ['
en_word_m = (?) or
en_word_f = (?) or
fr_word_m = (?) or
fr_word_f = (?)
',
params[:word], params[:word], params[:word], params[:word]
]
)
end
Как вы можете видеть, код немного запутанный и не очень restful. Это также делает помощников для ссылок занозой в заднице, и лучше просто использовать хэш вместо этого. Мне интересно, есть ли лучший способ сделать это.
Ответ №1:
Rest — это взаимодействие с ресурсом. Если ресурс имеет много слоев или аспектов, я не говорю ничего плохого, отражая это в ваших маршрутах:
dictionary/en-f/:word, :as => en_f_word
dictionary/en-m/:word, :as => en_m_word
dictionary/fr-f/:word, :as => fr_f_word
dictionary/fr-m/:word, :as => fr_m_word
Преимущество этого заключается в том, что оно отражает природу объекта в URL-адресе и позволяет использовать гораздо более описательные помощники:
en_f__word_path(the_word)
Если вам нужны действительно описательные помощники, то оберните вышесказанное в помощник, который предоставит вам:
path_to_french_feminine_word(word)
Кроме того, :first устарел в пользу:
Thing.first(:conditions => {:column => 'value'})
Ответ №2:
Это в некоторой степени согласуется с ответом Ричарда.
Если вы когда-нибудь перейдете не только на французский и английский, вы можете определить свой маршрут следующим образом:
match "dictionary/:language-:sex/:word" => "dictionary#show", :as => "word"
Который позволит вам определить язык и пол, которые вы пытаетесь найти, из поступающего хэша параметров.
Затем вы могли бы выполнить некоторое метапрограммирование в своих помощниках, чтобы определить методы для всех языков и полов, которые вы поддерживаете.