Как мне создать представление, которое знает о полном маршруте.(Рельсы 3) - PullRequest
0 голосов
/ 28 сентября 2010

Как мне спроектировать мой вид так, чтобы он «запоминал» свой маршрут? Так что «Назад» на /team/1/members/1 ссылается на /team/1/members и /members/1 ссылается на /members?

У меня есть модели team и member. Команды имеют много членов.

Мои маршруты позволяют мне просматривать всех участников или участников команды.

  resources :teams do
    resources :members
  end
  resources :members do
    resources :member_parts
  end

В настоящее время я пытался сохранить согласованность маршрута. Но при этом мне, кажется, приходится много повторяться и добавлять много логики в представление. ( это просто кажется неправильным )

выдержка из app/views/members/show.html.erb

<%= link_to 'Edit', params[:team_id].nil? ? edit_member_path(@member) : edit_team_member_path(@member.team,@member) %> |
<%= link_to 'Back', params[:team_id].nil? ? members_path : team_members_path(@member.team) %>

Ответы [ 3 ]

2 голосов
/ 29 сентября 2010

Обновлен Обновлен код, проблема была в том, что метод не смог распознать путь, потому что я предоставил только идентификатор вместо класса.

Использовать полиморфные пути.

Ссылка для редактирования:

Создайте массив путей

paths = []
paths << @member.team if params[:team_id]
paths << @member
polymorphic_path(paths,:action=>:edit)

paths2 = []
paths2 << @member.team if params[:team_id]
paths2 << :members
polymorphic_path(paths2)

Для получения дополнительной информации см. Rails API

Надеюсь, что этобыть хорошей отправной точкой.

2 голосов
/ 28 сентября 2010

Быстрый взлом, не протестированный в Rails3, вам, возможно, придется адаптировать его:

В application_controller.rb

before_filter :store_location

def store_location
  session[:return_to] = request.fullpath
end

def redirect_back_or_default(default=root_path, flash=nil)
  session[:return_to] ||= default
  redirect_to(session[:return_to], flash)
  session[:return_to] = nil
end

На ваших маршрутах

match '/back' => 'application#redirect_back_or_default'

В ваших взглядах

<%= link_to 'Back', '/back' %>

Вы также можете использовать этот метод redirect_back_or_default в своих действиях…

1 голос
/ 29 сентября 2010

Вы можете посмотреть urligecne в плагине resource_controller и его помощниках URL . Он позволяет вам использовать object_path или collection_path и возвращает путь в соответствии с текущим URL, поэтому он просто делает то, что вы хотите.

Вы также можете добавить это грязное и безобразное решение:

# application helper
def collection_path
  request.request_uri.gsub(/\/[\d]+[\/]*$/, "")
end

Он должен удалять строки типа "/ 2 /" или "/ 14" или "/" в конце вашего URL. Однако я чувствую себя очень недолго, когда дело доходит до использования регулярных выражений, поэтому будьте осторожны с этим.

Вы можете использовать этого помощника в поле зрения:

<%= link_to "Back", collection_path %>

Также, чтобы сгенерировать edit путь, вы можете просто добавить строку «edit» в конце текущего URL. Вы можете создать edit_object_path помощник для этого:

def edit_object_path
  request.request_uri.chop('/') + "/edit"
end 

Но опять же, это довольно грязное решение, и вы должны быть осторожны.

EDIT: Когда я смотрю на ответ @dombesz, вероятно, это то, что вы ищете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...