1

私はこれらのモデルを持っています

  • 問題
  • 投票

has_many票を発行し、Votebelongs_toを発行します。投票モデルにはブール投票属性があります。問題のインデックスビューで、問題を順番に表示し、タイトル、本文、賛成票ボタン、反対票ボタン、および現在の賛成票と反対票の数を示すそれぞれのラベルを表示します。これは、issue_idとvote(1または0)の非表示フィールドを持つフォームを使用して行います。Issueモデルのメソッドは、投票をカウントすることになっています。しかし、私は0が返され続けます。Totalvotes_countは機能しますが、他の2つは機能しません。サーバーログに、適切なissue_idとvote valueで投票が作成されているのがわかりますが、何らかの理由でクエリが機能していません。

発行モデル

class Issue < ActiveRecord::Base
attr_accessible :body, :end_at, :title
validates_presence_of :title, :body, :end_at
has_many :votes

def upvotes_count
    votes.count(:conditions => "vote = 1")
end

def downvotes_count
    votes.count(:conditions => "vote = 0")
end

def totalvotes_count
    votes.count
end

end

index.html.erb

<% @issues.each do |issue| %>
<li>
    <div class="issue">
        <h2><%= issue.title %></h2>
        <p><%= issue.body %></p>

        <%= form_for(@vote, :remote => true) do |f| %>
        <%= f.hidden_field "issue_id", :value => issue.id %>
        <%= f.hidden_field "vote", :value => 1 %>
        <%= submit_tag issue.upvotes_count.to_s + " Up", :class => 'up-vote' %>
        <% end %>

        <%= form_for(@vote, :remote => true) do |f| %>
        <%= f.hidden_field "issue_id", :value => issue.id %>
        <%= f.hidden_field "vote", :value => 0 %>
       <%= submit_tag issue.downvotes_count.to_s + " Down", :class => 'down-vote' %>
        <% end %>

    </div>
</li>
<% end %>

投票コントローラー

class VotesController < ApplicationController

  def index
    @votes = Vote.find(:all, :include => :issue)
  end

  def new 
    @vote = Vote.new(params[:vote])

    respond_to do |format|
        format.html # new.html.erb
        format.xml  { render :xml => @vote }
    end
  end

  def create
    @vote = Vote.new(params[:vote])

    respond_to do |format|
      if @vote.save
          format.js
          format.html { redirect_to issues_path }
      else
          format.html { redirect_to issues_path }
      end
    end
  end

end

コントローラを発行します(部分的)

class IssuesController < ApplicationController
  # GET /issues
  # GET /issues.json
  def index
    @issues = Issue.all

    @vote = Vote.new


    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @issues }
    end

終わり

4

2 に答える 2

1

あなたの問題はself、モデル内のメソッドに ""が呼び出されていないことだと思いますが、tamersalamaが述べたように、これは単純な投票追跡には行き過ぎである可能性があります。:upvoteand:downvote属性に単純な+1メソッドを書くのがおそらく最も簡単です。

于 2012-10-01T20:34:42.343 に答える
0

のデフォルト値は何ですかvote。NULLの場合、どちらも機能しません。

質問をもっと注意深く読む-それが賛成か反対かをvote決定するのに値のように見えます。にSTI(単一テーブル継承)メカニズムを使用することをお勧めします。このメカニズムでVoteは、type属性にインデックスを付けて、投票のタイプ(:upvote、:downvoteのいずれか)を格納するタイプ列を作成します。

ただし、これはすべてやり過ぎのようです(ドメインの残りの部分によって異なります)。各問題とともに投票をキャッシュするだけで済みます。賛成票と反対票の列で十分です。投票で他の属性を追跡したい場合を除いて(たとえば、賛成する人など)。

于 2012-10-01T20:22:14.207 に答える