it-swarm-pt.tech

Como usar Rails ajudantes de rota nomeados com parâmetros?

dada esta rota

match 'posts/hello/:name/:title' => 'post#show', :as => :hello
  • como posso chamar hello_path?

  • se eu chamar hello_path(@post), o que ele tenta fazer?

Eu esperava que os arquivos :name E :title Se ligassem ao caminho automaticamente, mas parece que Rails só sabe como tirar o: id do diretório objeto de modelo.

em vez disso, só funciona se eu chamar assim

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>

(falta de documentação adequada está realmente me matando)

27
Ant

Para responder suas duas perguntas:

  • Na linha de comando, execute rake routes Para ver quais rotas existem no seu aplicativo. Ele mostrará todas as maneiras pelas quais você pode usar as rotas nomeadas, basta adicionar "_path" ou "_url" ao nome da rota que é mostrada à esquerda.
  • Chamar hello_path(@post) irá gerar um URL para a página show show dessa instância hello.

O jeito que você está chamando é a norma:

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>

No entanto, isso também pode funcionar:

<%= link_to "link2", hello_url(@post.name, @post.title) %>

Aqui está alguma documentação (além da API Rails)) que deve ajudar. http://guides.rubyonrails.org/routing.html

17
GregT

Para responder à sua pergunta "o que faz hello_path tente fazer?"

hello_path sabe quantos parâmetros ele deve obter. Isso é contado nos parâmetros nomeados em config/routes. Ele aceitará um hash ou uma lista de argumentos. Se você der um hash, as chaves deverão corresponder aos nomes dos parâmetros da URL. Se você fornecer uma lista de argumentos, eles serão comparados por posição - o primeiro argumento com o primeiro parâmetro nomeado.

Então, ele chamará to_param on cada parâmetro individualmente antes de juntar todos eles ( veja o código aqui, ramificação 4. ).

Se você passar um objeto quando ele espera 2 ou mais parâmetros, ele nem sequer chamará to_param no objeto. É quando você recebe erros sem rastreamento de pilha que dizem algo como
No route matches {:controller=>"posts", :action=>"show", :id=>#<Post ...>}

Trabalhando com 1 parâmetro nomeado

Se você tiver apenas um parâmetro nomeado, as coisas serão bem diretas. Se precisar procurar suas postagens por nome, em vez de id, basta redefinir to_param

class Post < ActiveRecord::Base
  ...
  def to_param
    name
  end
end

Trabalhando com Vários Parâmetros Nomeados

Mas se o URL tiver mais de um parâmetro nomeado, redefinir to_param não é suficiente. Digamos que você tentou isso:

# app/models/post.rb
class Post < ActiveRecord::Base
  ...
  def to_param
    {name: name, title: title}
  end
end

# app/views/posts/index.html.erb
<%= post_path(post) %>

Nesse caso, você receberá um erro de roteamento porque não está transmitindo argumentos suficientes para post_path (veja acima). Para contornar isso, eu ligo para to_param explicitamente:

 # app/views/posts/index.html.erb
 <%= post_path(post.to_param) %>

Isso é um pouco menos liso que a maioria dos roteadores Rails mágica de roteamento, mas funciona perfeitamente bem. Se você mudar mais tarde a maneira como está consultando Posts, tudo o que você precisa fazer é redefinir to_param. Não há necessidade) se preocupar com todos os lugares que você ligou post_path

Sob o capô

O código relevante a ser observado é actionpack/lib/action_dispatch/routing

14
declan

Você também pode chamar assim

hello_path(@post.name, @post.title)

Espero que ajude.

6
James

As outras respostas (no momento da redação deste artigo) são boas, mas sua resposta à resposta de GregT mostra uma falta de entendimento sobre o Rails, o que é bom - todos nós já estivemos lá.

Especificamente, três dos princípios-chave por trás do Rails: convenção sobre configuração, arquitetura do modelo-visualização-controlador (MVC) e . É uma coisa no começo de todo livro inicial Rails. Os iniciantes geralmente pensam que podem simplesmente pular para o primeiro capítulo com código, mas Rails difere de muitos outros tópicos, pois os primeiros capítulos explicam conceitos importantes e não são apenas introdutórios. Como Rails não é "código", é uma "estrutura de código".

"Convenção sobre configuração" significa que, se você seguir certas convenções, se beneficiará dos comportamentos incorporados ao Rails. O roteamento é uma dessas áreas, se não a maior, em que a convenção beneficia o desenvolvedor, embora seja totalmente configurável.

Os caminhos que seguem um formato de roteamento específico são analisados ​​no controlador, na ação e possivelmente em um ID, formato e parâmetros adicionais. Por padrão e no mínimo, um caminho Rails (e também um Sinatra) assume o seguinte formato e ordem:

/controller_name/action_name

É um pouco mais complicado que isso, com mais opções e parece mais com isso na realidade:

/controller_name/action_name/(id)(.format)(?param=value)(&...)

... mas é mais detalhado do que o necessário para esta resposta.

O controlador é o C no MVC, ou a classe que manipula a solicitação. A ação é uma das sete ações RESTful (index, show, new, create, edit, update e destroy) dentro desse controlador. Nem todas as ações requerem um ID (index, new e create) e nem todas são get solicitações (solicitações que geram uma exibição, por exemplo destroy, create e update não têm visualizações).

Juntando tudo, vemos este exemplo:

/articles/edit/1

... encaminhará a solicitação para a ação 'edit' no controlador ArticlesController passando a id 1. Espera-se que o controlador faça algumas tarefas domésticas, como autenticação e autorização, e recupere o modelo Article ( M CV) com ID 1 e passe-o para a visualização "editar" (MC V ).

É melhor, especialmente para os novos desenvolvedores do Rails, seguir essas convenções e talvez adicionar algumas ações adicionais além daquelas fornecidas pelo REST.

Você pode sair dessa convenção configurando em seu arquivo routes.rb um esquema de roteamento alternativo, não seguindo REST, etc., mas será como um salmão nadando rio acima - é muito mais difícil do que acompanhar o fluxo. Se você seguir esse caminho (trocadilho), fará muito trabalho adicional para si próprio, provavelmente reinventará um pouco a roda e perderá as vantagens fornecidas pela estrutura Rails. Se você se encontrar nessa situação por qualquer motivo, talvez Rails não seja a ferramenta certa para o seu trabalho.

5
IAmNaN