2016-10-27 3 views
1

У меня есть приложение Rails (4.2.6), которое имеет таблицы типа companies (id, serial...), user (id, serial, company_id...), где serial - случайная сгенерированная строка длиной 5-20 символов и уникальная для каждой таблицы. То, что я пытаюсь добиться, чтобы иметь маршруты, как /companies/:serial и /users/:serial ...Rails - переопределяющие параметры параметров маршрута - GLOBALLY

Я прочитал documentation, и может сделать следующее routes.rb:

resources :companies, param: :serial 
resources :users, param: :serial 

Теперь, это не слишком DRY .. Есть ли способ сделать это глобально? Я знаю, что я мог бы иметь это в одной строке (resources :companies, :users, param: :serial), но у меня есть другие таблицы в других пространствах имен, к которым я также хотел бы применить правило.

Еще одна вещь, о которой я думал, заключалась в том, чтобы иметь серийный номер в качестве первичного ключа, но я предпочитаю автоинкрементное целое число и не хочу засорять мой db столбцами, такими как user.company_serial с 10-20 символами длинными значениями ...

Я попытался сделать сферу с param: :serial вокруг моих ресурсов:

scope param: :serial do 
    resources :companies 
    ... 
end 

как с path_names (читать here в документации), но это не дало желаемого результата, а не добавил params[:param] с символом значение :serial почему-то я действительно не понимаю.

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

+1

Явное указание на каждый стол не обязательно плохо. Время от времени DRY заходит слишком далеко в Ruby (прочитайте исходный код скрепки). Я думаю, что каждая таблица, явно определяющая его последовательные ресурсы в локальном пространстве, прекрасна. Однако сочетание первых двух строк в одном кажется практичным. – Pyrce

+1

@Pyrce, вы правы, но я хотел бы применить правило для всего приложения, и я чувствую, что sheperd начал перечислять овец, как «sheep1 is white, sheep2 is white, sheep3 is white ...» со всеми 400 он вместо того, чтобы сказать, что все овцы белые ... В конце концов, это то, что я собираюсь делать, если нет другого пути – Misu

ответ

1

То, как вы это делаете, представляет собой серийный номер в URL-адресе, как вы бы сделали с идентификатором param, params[:id] и использовать его в контроллере.

Company.find_by_serial(params[:id) 

Вам не нужно менять маршруты, просто действия контроллера. Это тоже можно иссушить.

Вы можете сделать это, явно передав серийный номер или добавив метод to_param. Если вы добавите to_param к модели, она всегда будет использовать это во всех местах, где он будет генерировать маршрут, в котором он использовал бы идентификатор, и сэкономить вам некоторую работу. Если есть место, которое вы предпочитаете использовать id (я предпочитаю это в некоторых контроллерах, таких как контроллеры админов), тогда вы должны явно передать его или обойти это.

+0

Да, хороший. Я тоже подумал об этом, только мне показалось, что я немного взломан, и я чувствовал, что у Rails будет «официальный» способ высушить его. Кроме того, если я посмотрю на этот код, скажем, два года, я могу смутить себя строками 'find_by_serial (params [: id])' – Misu

+0

Да, - согласился. Некоторое время я искал метод scope и, похоже, не использовал параметр param и не передавал его отдельным вызовам ресурсов. Я бы тоже этого ожидал. – Swards

Смежные вопросы