如何用link_to标签传递参数?

How to pass parameters with link_to tag?

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

如果我使用

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

in posts#vote ,它会抛出错误,因为我们没有将 :id 传递给参数哈希。
当我单击 upvote 按钮时如何将 :id(post) 传递给 params hash 以消除错误得到。

这是 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 标签。

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

请帮助我。提前致谢

尝试在您的机器上点击以下本地主机 URL:

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

我会建议您完成 Ruby on Rais Guides

像这样

已编辑:

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

传入@post.id 将在参数散列中传入该对象的 ID(作为参数[:id])。

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

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

注意:您不需要在 post 上调用 id,rails 会自动为您解决这个问题。

更好的解决方案是为您 Post 对象使用资源路由。然后添加 upvote/downvote 操作:

# 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 已经完成了如何制作和 link 到 url 的所有繁重工作,以便更快地将 rails 视图和控制器连接在一起,你绝对应该阅读官方指南 http://guides.rubyonrails.org/routing.html,乍一看可能会让人望而生畏,但它们很快就会成为第二知识。