Параметр метода модели маршрутизации Rails - PullRequest
0 голосов
/ 14 декабря 2009

у меня есть маршрут

map.member 'members/:id/:name_url', :controller => 'members', :action => 'show', :requirements => { :id => /\d+/ }

и в моей модели Member у меня есть метод name_url, который берет имя, преобразует его в строчные и заменяет пробелы на тире

проблема в том, что, если я запускаю

link_to "Bill", member

выдает ошибку "member_url не удалось сгенерировать"

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

Ответы [ 2 ]

0 голосов
/ 15 декабря 2009

Проблема в параметре: name_url в вашем маршруте:

map.member 'members/:id/:name_url', :controller => 'members', :action => 'show', :requirements => { :id => /\d+/ }

Когда вы передаете объект ActiveRecord в качестве опции для url_for (что и делает link_to), Rails будет неявно вызывать метод to_param модели. Который, если не переопределен, только возвращает id id. Вы можете переопределить to_param, но это не даст вам URL, который вы хотите. Потому что to_param используется для создания строки, которая заменяет id в URL. Лучшее, что вы могли бы сделать с минимальными изменениями, это согласиться на что-то вроде этого:

members/:id 

где: id на самом деле :id-:name_url

Действительно лучший вариант - это то, что предлагает Дэн МакНевин. Однако, если это слишком долго для вас, вы всегда можете просто сделать это помощником:

def link_to_member member
  link_to member.name, member_url(member, :name_url => member.name)
end

И используйте его вместо link_to.

link_to "Bill", member => link_to_member member

0 голосов
/ 14 декабря 2009

Предполагая, что это действие шоу MembersController

class MembersController

  def show
    @member = Member.find_by_name("Bill")
  end

В app/views/members/show.html.erb, вы захотите использовать:

<%= link_to @member.name, member_path(@member, :name_url => "something") %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...