Rails 3: надежный маршрут для моего англо-французского словаря

#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"
  

Который позволит вам определить язык и пол, которые вы пытаетесь найти, из поступающего хэша параметров.

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