2017-10-06 121 views
-1

當「的link_to」,而不使用塊它的工作完美:的Rails:用的link_to做塊不起作用

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

但是當我嘗試使用它的塊錯誤結束:

 <%= 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 %> 

這裏是錯誤消息:

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): 

所以現在看來​​似乎不理解字面哈希,但是,我太新手找出WH在錯誤的...任何幫助表示讚賞!

P.S .:我不能刪除文字哈希,因爲link_to搞亂了CSS類(增加類作爲地址的一部分)。我也有,因爲控制器名稱是由變量(在我的例子是降低了代碼的可讀性)

UPDATE代表使用較早的說法風格替代了類似「upvote_post_path」:

的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

您可以傳遞路由,而不是傳遞控制器,操作和id。你能添加你的路線嗎? –

+0

是的,當然!我會更新這個問題。 –

回答

2

在事物的左大括號,如:

some_method { a: 'b' } 

是模糊的。 {可能會打開一個塊,如a.each { ... }或它可能打開一個哈希文字。你認爲它是後者,但Ruby認爲它是前者,那就是錯誤的來源。

最簡單的解決方案是使用方法,主叫括號:

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

你也可以使用一個變量來移動別處開括號:

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

這一個:

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

工作正常,因爲第一個參數("Ololo",)通過電話消除任何歧義ling Ruby,它正在解析一個參數列表。

+0

非常感謝!第二種方式完美運作。但是,第一個(帶圓括號)導致了一個錯誤:SyntaxError(/home/alex/test/app/views/application/_votes_exp.html.erb:4:語法錯誤,意外',',期待')' 。 ..tion:「upvote」,id:entity.id},方法:: put,remote:true,... –