如何使用link_to标记传递参数?

时间:2015-12-14 18:42:48

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

我是铁杆上的红宝石 我正在使用 匹配“:controller(/:action(/:id))”,:via => [:GET,:PUT] 作为路由系统。
我正在使用 acts_as_votable gem为帖子设置投票系统 目前我在帖子#show 页面。我有两个链接,一个是 upvote ,另一个是 downvote
点击 upvote 后,我想点击帖子#upvote 操作,然后再次重定向到帖子#show (同一页面)页面。<登记/> 为此,我需要在upvote操作中传递:id (post)的参数。

如果我使用

@post = Post.find(params[:id])
帖子#pop中的

,它会抛出一个错误,因为我们没有将:id 传递给params hash。
当我点击 upvote 按钮以便摆脱我得到的错误时,如何将:id (post)传递给params哈希。

这是帖子#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


以下是帖子#show 页面中的链接标记。

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

请帮帮我。提前致谢

3 个答案:

答案 0 :(得分:3)

您已在控制器中正确执行此操作,只需在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对象的资源路由。然后添加upvote / downvote动作:

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

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

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

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

Rails已经完成了如何制作和链接到网址的所有繁重工作,要更快地将管道视图和控制器放在一起,你一定要阅读官方指南http://guides.rubyonrails.org/routing.html,然后一开始可能看起来令人生畏,但他们很快就会成为第二知识。

答案 1 :(得分:2)

像这样的东西

编辑:

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

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

答案 2 :(得分:0)

尝试从您的计算机点击以下localhost网址:

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

我建议您浏览Ruby on Rais Guides