Verificar o referencial de 'caminho/:id'
-
21-12-2019 - |
Pergunta
Eu tenho um recurso padrão:
resources :customers
Na página "mostrar" (/customers/:id
) há um link de referência para outros clientes.Quando eu clicar nele, como faço para verificar se é ou não o referer é /customers/:id
página?Eu tentei fazer isso:
[1] pry(#<CustomersController>)> URI(request.referer).path
=> "/customers/88" # previous ulr
[2] pry(#<CustomersController>)> customer_path
=> "/customers/98" # current url
mas ele não funciona.Em outras palavras, :id
no /customers/:id
sempre muda, então, como eu posso verificar se URI(request.referer).path
pertence a customer_path
?
if URI(request.referer).path == ??? #???
Solução
Isto irá funcionar, no entanto, está longe de ser bonita.No entanto, é bastante flexível e está retransmitindo em url gerado pelo helper, portanto, não deve quebrar se você decidir alterar mapeamentos de url.
if URI(request.referer).path =~ Regexp.new(customer_path(':customer_id').gsub(':customer_id', '\d+'))
MUITO, MUITO, MELHOR SOLUÇÃO:
Aplicação Rails tem um método para reconhecer os caminhos já e retorna com controlador/ação:
Rails.application.routes.recognize_path(URI(request.referer).path)
#=> {:controller => 'customers', :action => 'show', :id => '88'}
Você pode usá-lo para escrever um método auxiliar:
def is_referer_customer_show_action?
referer_url = Rails.application.routes.recognize_path(URI(request.referer).path)
referer_url[:controller] == 'customers' && referer_url[:action] == 'show'
end