我的Rails应用程序中有一个投票按钮,允许用户投票我创建了一条连接按钮和相应操作的路线。
路线:
/posts/1/vote_up
但是在其他ROR网站上,我一直在分析他们可以在不创建路线的情况下完成同样的事情(或者至少在没有向公众用户展示的情况下)。一个例子是Producthunt,有一个投票按钮,但当你将鼠标悬停在它上面时,没有路由或URL映射到它。
如何做到这一点?我可以将动作链接到按钮而不创建路径吗?
答案 0 :(得分:0)
在不了解您的控制器或模型的情况下,您将如何做到这一点。这是一个无声的Ajax调用。
<%= form_tag(post, id: "post" + String(post.id),method: :patch, remote: true, authenticity_token: true) do %>
<%= hidden_field_tag "post[voter]", current_user.id %>
<%= hidden_field_tag "post[vote_up]", true %>
<%= button_tag "Up Vote", onclick: "$('#post#{String(post.id)}').trigger('submit.rails');" %>
<% end %>
method: :patch
会从您的控制器调用更新方法。所以现在你不需要定义一条路线。
如果您在数据库中进行增量操作,则需要在控制器的更新方法中添加逻辑以捕获参数,删除它,然后增加计数。您可能还希望实现一种方式,即当前用户每个帖子只能投票一次。
在您的控制器中,如果您想要format.js {render nothing: true}
def update
respond_to do |format|
if @post.update(post_params)
format.js {render nothing: true}
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { render :show, status: :ok, location: @post }
else
format.js {render nothing: true}
format.html { render :edit }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
如果我只需要一个&#39; link_to&#39;使用静默AJAX调用控制器中的函数(而不是像你的例子中那样执行form_tag),我将如何实现它?
链接本身不会发送任何数据......这就是您必须定义路由的原因。除非你给出链接参数。
<%= link_to "Up Vote", post_path(@post, post: {up_vote: true}) %>
您还可以为此提供方法。因此,如果您放置method: :patch
,则应调用您的更新方法。
<%= link_to "Up Vote", post_path(@post, post: {up_vote: true}), method: :patch %>
这些示例将以params的形式在URL中添加一堆文本:
# posts/1?post[up_vote]=true
所以这可以在不配置routes.rb
文件的情况下工作。但您可能需要添加更多参数并修改控制器以处理这些参数。
我在这里写的内容不会显示为表单,但看起来就像一个按钮。您可以将button_tag
替换为支持onclick
的任何其他内容,以将您想要的数据提交给服务器。
使用表单的隐藏字段来传递您要使用的数据,而不是超链接引用。您实际上无法使用link_to而不提供hpyerlink引用。所以替代它是content_tag 'a'
。只需替换上一个表单button_tag
行即可生成此内容。
<%= form_tag(post, id: "post" + String(post.id),method: :patch, remote: true, authenticity_token: true) do %>
<%= hidden_field_tag "post[voter]", current_user.id %>
<%= hidden_field_tag "post[vote_up]", true %>
<%= content_tag 'a', "Up Vote", onclick: "$('#post#{String(post.id)}').trigger('submit.rails');" , style: 'cursor: pointer' %>
<% end %>
现在看来你有一个常规链接,当你点击它时鼠标会改变。现在的问题是,当人们点击&#34; Up Vote&#34;链接。您需要添加CSS和/或JS操作,以便在用户点击链接后更改用户的视图。因此,除了执行提交的onlcick
之外,您还需要调用Javascript方法来修改内容来自&#34; Up Vote&#34; to&#34;感谢投票!&#34;。除此之外,它没有出现&#34;出现&#34;成为一个表格,你有你的链接。
如果由于某种原因确实希望在点击链接后重新加载页面,则可以更改JS响应。
format.js { redirect_to @post, notice: 'Thanks for voting!' }
答案 1 :(得分:0)
试试这个。这是我们在命名路由之前使用的东西:
link_to "Link to listing new", controller: :listings, action: :new
#or
link_to "string method", "/listings/new"