自学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方法。这可能是可笑的容易,但我已经碰到了墙,非常感谢任何帮助。
此外,欢迎任何关于如何做得更好的建议!
由于
西蒙
答案 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 %>