2017-10-06 16 views
-1

Lorsque « link_to » est utilisé sans bloc, il fonctionne parfaitement:Rails: link_to avec bloc faire ne fonctionne pas

<%= link_to "Ololo", {controller: "posts", action: "upvote", id: post.id}, method: :put, remote: true, class:"nav-link" %> 

Mais lorsque je tente d'utiliser le bloc, il finit avec l'erreur:

 <%= link_to {controller: "posts", action: "upvote", id: post.id}, method: :put, remote: true, class:"nav-link" do %> 
      <%= image_tag('icons/candy.svg', alt: "Candies", class:"rounded-circle icon-nav") %> 
      <%= post.get_upvotes.size %> 
     <% end %> 

Et voici le message d'erreur:

SyntaxError (/home/alex/test/app/views/application/_votes_exp.html.erb:5: syntax error, unexpected ':', expecting '}' 
...r.append= link_to {controller: controller_name, action: "up... 
...        ^
/home/alex/test/app/views/application/_votes_exp.html.erb:5: syntax error, unexpected ',', expecting '}' 
...troller_name, action: "upvote", id: entity.id}, method: :put... 
...        ^
/home/alex/test/app/views/application/_votes_exp.html.erb:5: syntax error, unexpected tLABEL 
...pvote", id: entity.id}, method: :put, class:"nav-link", remo... 
...        ^
/home/alex/test/app/views/application/_votes_exp.html.erb:5: syntax error, unexpected ',', expecting keyword_end 
...method: :put, class:"nav-link", remote: true do @output_buff... 
...        ^
/home/alex/test/app/views/application/_votes_exp.html.erb:49: syntax error, unexpected keyword_ensure, expecting end-of-input): 

il semble donc que cela ne comprend pas hachage littérale, mais je suis trop novice pour savoir wh à tort ... Toute aide est appréciée!

P.S .: Je ne peux pas supprimer le hachage littéral, car link_to est en désordre avec la classe css (ajoute la classe comme partie de l'adresse). Aussi je dois utiliser le style argument plus au lieu de quelque chose comme « upvote_post_path » parce que le nom du contrôleur est représenté par la variable (dans mon exemple, il est réduit pour une meilleure lisibilité du code)

MISE À JOUR:

routes.rb

Rails.application.routes.draw do 
    root to: "home#index" 

    resources :posts do 
    member do 
     put "upvote", to: "posts#upvote" 
    end 
    end 
end 
+0

Vous pouvez passer la route en passant le contrôleur, l'action et l'ID. Pouvez-vous ajouter vos itinéraires? –

+0

Oui, bien sûr! Je vais mettre à jour la question. –

Répondre

2

L'accolade d'ouverture des choses comme:

some_method { a: 'b' } 

est ambigu. Le { peut ouvrir un bloc comme dans a.each { ... } ou ouvrir un littéral de hachage. Vous pensez que c'est le dernier mais Ruby pense que c'est le premier et c'est de là que vient l'erreur.

La solution la plus simple est d'utiliser la méthode-appel-parenthèses:

<%= link_to({controller: "posts", action: "upvote", id: post.id}, method: :put, remote: true, class:"nav-link") do %> 
      ^--------------------------------------------------------------------------------------------------^ 

Vous pouvez également utiliser une variable pour déplacer l'accolade d'ouverture ailleurs:

<% upvote_post = { controller: 'posts', action: 'upvote', id: post.id } %> 
<%= link_to upvote_post, method: :put, remote: true, class:"nav-link" do %> 

Celui-ci:

link_to "Ololo", {controller: "posts", ... 

fonctionne bien parce que le premier argument ("Ololo",) supprime toute ambiguïté par téléphone ling Ruby qu'il analyse une liste d'arguments.

+0

Merci beaucoup! La deuxième façon a fonctionné parfaitement. Cependant, le premier (avec des parenthèses) a provoqué une erreur: SyntaxError (/home/alex/test/app/views/application/_votes_exp.html.erb:4: erreur de syntaxe, inattendue ',', ')' . ..tion: "upvote", id: entity.id}, méthode:: put, remote: vrai, ... –