【问题标题】:How to pass parameters with link_to tag?如何使用 link_to 标签传递参数?
【发布时间】:2016-03-20 08:41:57
【问题描述】:

我是 ruby​​ on rails 的新手。
我使用 ma​​tch ":controller(/:action(/:id))", :via => [:GET, :PUT] 作为路由系统。
我正在使用 acts_as_votable gem 来设置帖子投票系统。
目前我在 posts#show 页面。我有两个链接,一个是 upvote,另一个是 downvote
在我点击 upvote 后,我想点击 posts#upvote 操作,然后再次重定向到 posts#show(同一页面)页面。 为此,我需要在投票操作中传递 :id(post) 的参数。

如果我使用

@post = Post.find(params[:id])

在 posts#vote 中,它会引发错误,因为我们没有将 :id 传递给 params 哈希。
当我单击 upvote 按钮时,如何将 :id(post) 传递给 params 哈希,以消除我遇到的错误。

这是 posts#upvote 操作代码。

def upvote
    @post = Post.find(params[:id])
    @post.upvote_from User.find(session[:user_id])
    redirect_to(:controller => "posts", :action => "show", :id => @post.id)    
end


这是 posts#show 页面中的链接标签。

<%= link_to({:controller => "posts", :action => "upvote"}) do %>                        
    <span>Like</span>
    <span>(<%= @post.get_upvotes.size %>)</span>                        
<% end %>

请帮助我。提前致谢

【问题讨论】:

  • localhost:3000/posts/1 其中1 是您的:id
  • 请编辑您的问题以包含您拨打link_to的查看代码。
  • 如果你点击/posts/vote/1会发生什么?

标签: ruby-on-rails ruby ruby-on-rails-4 routing params


【解决方案1】:

您已经在控制器中正确执行此操作,您只需在 link_to url 选项中包含 :id:

<%= link_to(:controller => "posts", :action => "up vote", :id => @post) do %>
    <span>Like</span>
    <span>(<%= @post.get_upvotes.size %>)</span>
<% end %>

注意:您无需在帖子中致电id,rails 会自动为您解决此问题。

更好的解决方案是为您的 Post 对象使用资源路由。然后添加赞成/反对行动:

# in config/routes.rb
resources :posts do
    member do
        match "upvote", :as => :upvote, :via => [:get, :put]
    end
end

Rails 会自动创建您可以在视图中使用的 url 助手

# in show html.erb
<%= link_to(upvote_post_url(@post)) do %>
    <span>Like</span>
    <span>(<%= @post.get_upvotes.size %>)</span>
<% end %>

这样做的好处是代码更简单,并且能够通过更新模板代码来更改您的路线。

Rails 已经完成了如何制作和链接到 url 的所有繁重工作,以便更快地将 Rails 视图和控制器结合在一起,您绝对应该阅读官方指南http://guides.rubyonrails.org/routing.html,起初可能看起来令人生畏,但是他们将很快成为第二知识。

【讨论】:

    【解决方案2】:

    类似的东西

    已编辑:

    <%= link_to "Upvote", "#{Rails.root}/posts/upvote/#{@post.id}" %>
    

    传入@post.id 将在params 哈希中传入该对象的id(作为params[:id])。

    【讨论】:

    • 我使用 match ":controller(/:action(/:id))", :via => [:GET, :PUT] 作为路由系统。在 rake 路线之后,它只显示两条路线。前缀动词 URI 模式 Controller#Action root GET / users#login GET|POST /:controller(/:action(/:id))(.:format) :controller#:action
    • 好吧,我不确定从 link_to 调用中引用此类路由的确切语法,但也许可以尝试这样的操作:。让我知道这是否有效,我将编辑我的答案以包含它。
    • 我发了#upvote,我实际上应该为“@post.upvote_from User.find(session[:user_id])”方法使用@post 变量。点击upvote按钮后我需要抓住帖子
    • 我的意思是,如果您使用 link_to 提供一个带有 posts/upvote/1 格式的链接(通过传入 @post.id 作为 url 的最后一部分),然后从 upvote行动,你可以通过说@post = Post.find(params[:id])再次找到该帖子。
    • 我按照你所说的传递了 url,但我收到错误 No route matches [GET] "/posts/show/posts/upvote/6"。但是 6 是实际的帖子 ID
    【解决方案3】:

    尝试从您的机器上点击以下 localhost URL:

    localhost:3000/posts/upvote/1 # where 1 is your :id
    

    我建议你通过Ruby on Rais Guides

    【讨论】:

    • 正如我已经提到的,我使用 match ":controller(/:action(/:id))", :via => [:GET, :PUT] 作为路由系统并且链接应该命中帖子#upvote 行动。请帮助我解决这些问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多