【问题标题】:Rails: link_to with do block doesn't workRails:带有do块的link_to不起作用
【发布时间】:2017-10-06 22:17:59
【问题描述】:

当 'link_to' 不加块地使用时,它可以完美地工作:

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

但是当我尝试使用 block 时,它会报错:

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

所以它似乎不理解文字哈希,但是,我太新手了,无法弄清楚出了什么问题......感谢任何帮助!

P.S.:我无法删除文字哈希,因为 link_to 搞乱了 css 类(添加类作为地址的一部分)。此外,我必须使用较旧的参数样式而不是“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

【问题讨论】:

  • 你可以传递路由而不是传递控制器、动作和 id。你能添加你的路线吗?
  • 是的,当然!我会更新问题。

标签: ruby-on-rails ruby views helper link-to


【解决方案1】:

像这样的左大括号:

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",) 通过告诉 Ruby 它正在解析参数列表来消除任何歧义。

【讨论】:

  • 非常感谢!第二种方法很完美。但是,第一个(带括号)导致错误: SyntaxError (/home/alex/test/app/views/application/_votes_exp.html.erb:4: syntax error, unexpected ',', expecting ')' .. .tion: "upvote", id: entity.id}, method: :put, remote: true, ...
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多