Rails 4使用link_to或button_to来运行方法?

时间:2014-02-06 03:55:38

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

我正在实施一个简单的投票系统,点击按钮就会增加+1。例如,如果一个问题有5票,它就会增加。我已经编写了该方法,但我不确定如何通过单击link_to来执行它。我需要重新配置我的路线吗?

questions_controller.rb

  def self.ping
    @question = Question.find(params[:id])
    @question.increment!(:amplify)

    render_to do |format|
      if @question.save
        format.html { redirect_to @question }
      end
    end
  end

的routes.rb

resources :questions
post '/ping' => 'questions#ping', as: 'ping'

2 个答案:

答案 0 :(得分:2)

您的路线需要支持id

post '/ping/:id' => 'questions#ping', as: 'ping'

或者更好的是,如果你想让它在问题范围内:

resources :questions do
  post '/ping' => 'questions#ping', as: ping
end

但是,我认为你不想在questions_controller中使用类方法ping。我想你只想要一个实例方法:

def ping
  @question = Question.find(params[:id])
  @question.increment!(:amplify)

  if @question.save
    render_to do |format|
      format.html { redirect_to @question }
    end
  end
end

如果这不起作用,您在日志中看到了什么错误?

答案 1 :(得分:0)

除了CDub的回答,您可能会受益于member route (2.10)


<强>路线

#config/routes.rb
resources :questions do
   member do 
       post :ping
   end
end

这应该提供以下路线:

http://yourapp.com/questions/:question_id/ping

查看

此网址只能从POST访问,最好使用link_to访问:

<%= link_to "+1", question_ping_path(question.id), method: :post %>

<强>控制器

您不需要在控制器中声明类方法

#应用程序/控制器/ questions_controller.rb  def ping     @question = Question.find(params [:question_id])     @ question.increment!(:扩增)

render_to do |format|
    format.html { redirect_to @question }
end

.increment!保存记录:)