如何用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,乍一看可能会让人望而生畏,但它们很快就会成为第二知识。
我是 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,乍一看可能会让人望而生畏,但它们很快就会成为第二知识。