Rails 3: спокойный маршрут для моего англо-французского словаря - PullRequest
1 голос
/ 12 ноября 2011

Часть моего сайта имеет англо-французский словарь. Я хочу, чтобы 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

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

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

В некоторой степени это соответствует ответу Ричарда.

Если вы когда-нибудь расширили свое знание не только на французский и английский, вы можете определить свой маршрут следующим образом:

match "dictionary/:language-:sex/:word" => "dictionary#show", :as => "word"

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

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

1 голос
/ 12 ноября 2011

Отдых - это взаимодействие с ресурсом.Если у ресурса много слоев или аспектов, я не скажу ничего плохого в отражении этого в ваших маршрутах:

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'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...