我是铁杆上的红宝石
我正在使用 匹配“: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 %>
请帮帮我。提前致谢
答案 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