如何在不在rails中创建路由的情况下将操作链接到按钮?

时间:2014-11-02 07:11:21

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

我的Rails应用程序中有一个投票按钮,允许用户投票我创建了一条连接按钮和相应操作的路线。

路线:

/posts/1/vote_up

但是在其他ROR网站上,我一直在分析他们可以在不创建路线的情况下完成同样的事情(或者至少在没有向公众用户展示的情况下)。一个例子是Producthunt,有一个投票按钮,但当你将鼠标悬停在它上面时,没有路由或URL映射到它。

如何做到这一点?我可以将动作链接到按钮而不创建路径吗?

2 个答案:

答案 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}

,则可以添加任何内容的JavaScript响应
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"