2016-03-17 3 views
0

Это сбивает с толку меня так много, у меня есть 2 модели client has_many :invocies и invoice belongs_to client, У меня есть мой root настроить индексировать все invoices и invoices также могут быть доступны через clients show View , У меня есть кнопка назад в моем invoice show view, что ссылки обратно в client:id, что invoice принадлежитВернитесь к пути из шоу зрения на основе визуализации

Форма обратной связи ссылку счета/показать

<%= link_to 'Back', client_path(@invoice.client), class: "btn btn-primary" %> 

Это прекрасно работает, но его очень неудобно запускать invoice show из корневого пути а затем нажмите back и переадресуйте его на вид client show. Есть ли способ вернуться к root_path или показать 2 кнопки в инструкции if и показать один в зависимости от того, как пользователь запустил invoice show view в первую очередь? Полностью застрял.

Вот мои маршруты файл

resources :invoices, only: [:new, :create, :destroy, :index] 
resources :clients do 
    resources :invoices, shallow: true 
end 

root 'invoices#index' 

ответ

2

Простой: обратной ссылки

link_to 'Back', :back, class: "btn btn-primary" 

должен делать в этом случае. Он будет использовать функцию HTTP_REFERER или Javascript для перехода на предыдущую страницу. См. documentation для получения дополнительной информации.

Update:

Я вам нужны некоторые исключения из правила «просто ссылка назад», вы должны создать собственное решение. Одним из таких решений может быть то, что вы используете link_to :back по умолчанию , но переопределите его, приняв специальный параметр «back_path» в особых случаях. Для этого вы можете создать пользовательский помощник.

В следующем примере стандартная обратная ссылка используется по умолчанию, но позволяет предыдущей странице установить параметр back_path, который будет пониматься помощником back_link.

# application_helper.rb 
def back_link(params, name: "Back", class: "btn btn-primary") 
    if params[:back_path].present? 
    link_to name, params[:back_path], class: class 
    else 
    link_to name, :back, class: class 
    ens 
end 

Теперь вы используете ссылку нормально в ваших просмотров:

<%= back_link(params) %> 

И если вы хотите изменить поведение по умолчанию, просто передать back_path параметров. Этот параметр будет передан на странице, на которую вы хотите вернуться. Затем вам нужно будет передать этот параметр через все последующие страницы и/или переадресовать.

Скажем, для нетривиального примера, что на странице клиента show вы можете нажать на ссылку, чтобы создать новый счет-фактуру, а затем будет перенаправлен на страницу счета show и оттуда вы хотите, чтобы нажать на ссылку назад и получить к клиенту show страница снова.

Итак, добавьте ссылку на клиент показать страницу, с back_path пар, указывая на эту страницу:

# views/clients/show.html.erb 
<%= link_to 'New invoice', new_invoice_path(@client, back_path: client_path(@client)) %> 

В виде new страницы, вы должны добавить hidden_tag передать на back_path пары:

# views/invoices/_form.html.erb 
<%= hidden_field_tag 'back_path', params[:back_path] %> 

Далее в create действий контроллера, вы также должны пройти эти параметры при перенаправлении:

# controllers/invoices_controller.rb 
redirect_to invoice_url(@invoice, back_path: params[:back_path]) 

И, наконец, теперь вы можете использовать back_link помощника, чтобы отобразить правильную ссылку:

# views/invoices/show.html.erb 
<%= back_link(params) %> 

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

+0

Это нормально, за исключением случаев, когда создается новый счет-фактура. Я перенаправляюсь на 'show', поэтому ссылка обратно оттуда возвращает вас к форме' new invoice form' – Aloalo