在rails 3中投票app:如何链接到投票方法?

时间:2011-04-16 10:52:46

标签: ruby-on-rails-3 controller models erb

自学Rails,我正在构建一个非常简单的投票应用程序。

有2个型号,问题和选项。问题has_many选项和选项belongs_to Question。

使用标准脚手架,我已经达到了一个阶段,您可以添加问题,查看问题并向其添加选项并查看这些选项。

我现在要做的是添加一个代码,在单击链接时将option.count值增加一。我在Option模型中有一个vote_up方法:

class Option < ActiveRecord::Base
  validates :text, :presence => :true
  belongs_to :question

  def vote_up
    self.count += 1
  end
end

我的选项控制器如下所示:

class OptionsController < ApplicationController
  def create
    @question = Question.find(params[:question_id])
    @option = @question.options.create(params[:option])
    redirect_to question_path(@question)
  end

end

我的问题模型如下:

class Question < ActiveRecord::Base
  validates :text, :presence => {:message => 'A question normally has text...'}
  has_many :options, :dependent => :destroy


  def vote
    # Maybe the vote code will go here???
  end
end

我的问题控制器具有脚手架创建的常用new,create,edit,destroy方法。这里很少定制。

我的show.html.erb视图,我想将链接放到投票方法,如下所示:

  <p id="notice"><%= notice %></p>
    <p>
      <b>Question <%= @question.guid %></b>:
      <%= @question.text %>
    </p>
    <% if @question.options.count == 0 %>
        <p>Shame! there are currently no options to vote on. Add some! </p>
    <% elsif @question.options.count == 1 %>
        <p>One option in a vote is a dictatorship... Maybe add some more?</p>
    <% end %>
    <h2>Options:</h2>
    <% @question.options.each do |option| %>
      <p>
        <%= option.text %>:  ** Link to vote here!
      </p>
    <% end %>

    <h2>Add an option to vote on</h2>
    <%= form_for([@question, @question.options.build]) do |f| %>
      <div class="field">
        <%= f.label :text %><br />
        <%= f.text_field :text %>
      </div>
      <div class="actions">
        <%= f.submit %>
      </div>
    <% end %>

    <% if @question.options.count == 0 # Only show edit if no options saved. %> 
        <%= link_to 'Edit', edit_question_path(@question) %> |
    <% end %>
    <%= link_to 'Back', questions_path %>

所以我要做的是在每个选项旁边添加一个“投票”链接,调用选项模型中的vote_up方法。这可能是可笑的容易,但我已经碰到了墙,非常感谢任何帮助。

此外,欢迎任何关于如何做得更好的建议!

由于

西蒙

2 个答案:

答案 0 :(得分:1)

我认为@ oded-harth已经表现出正确的方式,但我有两个评论:

首先,Rails是一种美丽的语言,用于简化我们的开发人员生活;)在Rails中编程时,你绝不能忘记这一点。考虑到这一点,我想指出"increment()" method。因此,您可以简单地进行投票,而无需不必要的+= 1。使用decrement()进行投票。我相信你可以像这样使用它:option.increment(:count)

其次,我认为对于一个简单的投票行动来说,整个form有点肮脏。你可以使用这样的东西

<%= link_to "Vote Up", :url => { :action => :vote_up, :option_id => option.id }, :method => :put %>

为了使其有效,你必须设置这样的路线:

resources :votes
  put :vote_up
end

答案 1 :(得分:0)

我要做的是在控制器中制作vote_up方法:

def vote_up 

option = Option.find(params[:option_id])
option.count += 1

redirect (to where do you want...)

end

在视图中我会用这种方式调用该方法:

<%= form_for( option, :url => { :action => "vote_up", :option_id => option.id} ) do |f| %>
<%= f.submit("vote up") %>  
<% end %>