Rails`link_to`方法多次发布

时间:2009-08-25 04:01:41

标签: javascript ruby-on-rails ruby activerecord

[见后面的回答更多]

我认为这只是一个简单的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)

它按预期工作。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

澄清“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 - 你想要{{1}选项)

答案 2 :(得分: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}

答案 3 :(得分:0)

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

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

所以这里奇怪的是它可以工作,但是每次我重新加载页面时,它都会向所有用户添加一个回答(或大多数博客都会关注的评论),它也会产生网址{{ 1}},我不确定我的下一步行动计划是什么。


经过多一点调查后,这个例子中的vote_fu示例应用程序在控制器的创建操作中有这个,但我甚至没有控制器用于我的投票模型并且投票仍在进行,任何想法?

localhost/questions/65?method=post&url=true