【问题标题】:Rails `link_to` method posting multiple timesRails `link_to` 方法多次发布
【发布时间】:2009-08-25 04:01:41
【问题描述】:

[查看后面的答案了解更多]

我认为这只是一个简单的 Rails 问题,主要是关于我如何命名我的模型并在我看来引用它们。所以有一点背景,我正在使用vote_fu 插件,我认为这很棒,但是我很难通过如下链接进行投票:

<%= link_to "vote for", current_user.vote_for(answer) %>

current_user 是一个帮助器并返回当前登录的发出此请求的用户,问题可能在于我声明 answer 的方式,它属于我的 question 模型, 非常感谢任何帮助,即使你只是帮助我走上正确的道路!

哦!它也适用于控制台......所以如果我这样做:

user = User.find(1)
user.vote_for(Question.last)

它按预期工作。

【问题讨论】:

  • 您确认 current_user 实际上是在返回一个用户对象吗?
  • 因为我不知道vote_fu,所以我只会评论,但是current_user.vote_for(answer)返回什么?你不应该有一个路径或一个模型的实例,它有宁静的资源吗?
  • 嘿@theIV 你是对的......我确实需要一条路径,但由于它是 has_many 关联的主题,那条路径是什么样的?我对此感到困惑...user_answer_votes_path(answer)
  • @mike,是的,工作正常,控制台为我提供了完整的当前用户对象。
  • 所以我已经按照文档建议将其设置为路径,但我得到未定义的方法 `user_answer_votes_path' 似乎这不是正确的路径,请参阅此示例:github.com/peteonrails/vote_fu/tree/master

标签: javascript ruby-on-rails ruby activerecord


【解决方案1】:

current_user.vote_for(answer) 将立即调用该方法。仅仅因为它在 :url 中并不意味着它得到任何特殊处理。它将像任何其他 ruby​​ 方法一样执行。

你可能想做这样的事情。

// view
<%= link_to "Vote up", :url => vote_up_answer_path(answer), :method => "post" %>

// controller
class AnswersController < ApplicationController
  def vote_up
    answer = Answer.find(params[:id])
    current_user.vote_up(answer)
    redirect_to :back
  end
end

// routes
map.resources :answers, :member => {:vote_up => :post, :vote_down => :post}

【讨论】:

    【解决方案2】:

    这个例子很老了,在视图中有这个:

    <%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %>
    

    但这使得 URL 在查询字符串中具有投票方法......他正在使用 rjs,我更喜欢使用 jquery,不知道如何进行下一步以使其工作而不是投票页面上的所有答案?

    【讨论】:

      【解决方案3】:

      澄清“vote_for 属于你的控制器”:

      你有:

      <%= link_to "Vote Up", current_user.vote_for(answer) %>
      

      你真正想要的是:

      <%= link_to "Vote Up", :controller => 'my_controller', :action => 'vote', :id => answer %>
      

      current_user.vote_for 方法是服务器上的方法。如果您在视图(.rhtml 文件)中调用该方法,则投票将在页面呈现时进行,而不是在用户单击链接时进行。相反,在适当的控制器上创建一个“投票”方法(我在这里称之为my_controller,随心所欲)。 vote 方法看起来像 vote_fu 示例。 link_to 创建投票操作的超链接。

      如果您尝试通过 ajax 执行此操作,请将 link_to 替换为 link_to_remote

      <%= link_to_remote "Vote Up", :url => { :controller => 'my_controller', :action => 'vote', :id => answer } %>
      

      如果您的views/my_controller/vote 模板文件是“.rjs”,则该文件中的javascript 将在方法的结果返回到页面时执行。如果是“.rhtml”,您应该查看link_to_remote 的帮助程序,以便使用方法结果的包含轻松更新页面上的 div(http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001645 - 你想要:update 选项)

      【讨论】:

        【解决方案4】:

        废话!我解决了我的问题的第一部分......好吧......也许,我的解决方案似乎不是很平静,这就是我所做的:

        <%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %>
        

        所以这里奇怪的是它可以工作,但是每次我重新加载页面时,它都会向所有有答案的用户(或大多数博客所关注的 cmets)添加投票,它也会使 URL @987654322 @,我不确定我的下一个行动计划是什么。


        经过一番调查,vote_fu 示例应用程序的示例在控制器的创建操作中具有此功能,但我什至没有用于我的投票模型的控制器,并且投票仍在进行,有什么想法吗?

        def create
        @quote = Quote.find(params[:quote_id])
        
        respond_to do |format|
          if current_user.vote(@quote, params[:vote])
            format.rjs  { render :action => "create", :vote => @vote }
            format.html { redirect_to([@quote.user, @quote]) }
            format.xml  { render :xml => @quote, :status => :created, :location => @quote }
          else
            format.rjs  { render :action => "error" }
            format.html { render :action => "new" }
            format.xml  { render :xml => @vote.errors, :status => :unprocessable_entity }
          end
        end
        

        【讨论】:

        • 就像我上面说的,vote_for 调用属于你的控制器。 vote_for 投票。
        • 已经在插件的功能里了,还需要放到控制器里吗?
        • 你提到它在控制台中工作。您正在向您的用户对象发送一条消息“为最后一个问题投票”。现在想象一下 Ruby 构建链接时发生了什么:在构建链接时,您正在向用户对象发送一条消息“投票支持此答案”。让我们看一下示例代码 - /examples/votes/_voteable_vote.html.erb - 如果你想使用这个插件,最简单的方法就是在那个视图之后对你的代码建模。
        • 哇,很棒的反馈,这很有帮助,我想我应该使部分部分与示例相同以使其正确,这将阻止对页面重新加载进行投票,因为不会发出请求。 .. 我认为。我明天试试。感谢您的反馈。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2023-03-14
        相关资源
        最近更新 更多