帮助方法在我的索引页,星级评分系统中不起作用

时间:2014-01-02 00:50:38

标签: ruby-on-rails ruby partial-views rating-system helpermethods

我使用本教程实施了星级评分系统 http://eighty-b.tumblr.com/post/1569674815/creating-an-ajaxified-star-rating-system-in-rails-3

Ajax工作正常,我在BOOKS SHOW PAGE上的方法也是如此

但由于某些原因,我的帮助程序方法无法在我列出多个书籍的索引页面上工作,因此我无法在索引页面上调用current_user_rating。

它只是没有显示,就像在显示页面上显示整数或当前用户值,并在索引页面上。它只是显示“N / A”,即使它包含一个值。

我尝试了不同的东西,但似乎无法使其发挥作用......

如果您需要我添加任何其他内容,请与我们联系

新的铁路请帮助:)

助手

module BooksHelper 

##The first part of each Methods work on Show Page but Not Index

  def rating_ballot
    if @rating = current_user.ratings.find_by_book_id(params[:id])   ****
      @rating
    else
      current_user.ratings.new
    end
  end

  def current_user_rating
    if @rating = current_user.ratings.find_by_book_id(params[:id])   ****
     @rating.value
    else
      "N/A"
    end
  end

end

视图

show.html(books)

<div id="book<%= @book.id %>">
   <div id="rating">
     <%= render :partial => 'ratings/rating', :locals =>{:book => @book} %>
   </div>
</div>

index.html.erb(books)

  <% @books.each do |book| %>
    <table id="book<%= book.id %>">
      <tbody>  
        <tr>  
          <td>
            <%= book.title %>
          </td> 
        </tr> 

        <tr>

          <td  id="rating">                   
            <%= render :partial => 'ratings/rating', :locals =>{:book => book} %>
          </td>

        </tr>
      <tbody>
    </table>
  <% end %>

_rating.html.erb(评分)

 ###This Doesn't work in my INDEX PAGE :/

 Your Rating <%= current_user_rating %> 

 <%= form_for rating_ballot, :html => { :class => 'rating_ballot' }, :remote => true do |f| %>
   <%= render 'shared/error_messages', object: f.object %>

   <%= f.label("value_1", content_tag(:span, '1'), {:class=>"rating", :id=>"1"}) %>
   <%= radio_button_tag("rating[value]", 1, current_user_rating == 1, :class => 'rating_button') %>

   <%= f.label("value_2", content_tag(:span, '2'), {:class=>"rating", :id=>"2"}) %>
   <%= radio_button_tag("rating[value]", 2, current_user_rating == 2, :class => 'rating_button') %>

   <%= f.label("value_3", content_tag(:span, '3'), {:class=>"rating", :id=>"3"}) %>
   <%= radio_button_tag("rating[value]", 3, current_user_rating == 3, :class => 'rating_button') %>

   <%= f.label("value_4", content_tag(:span, '4'), {:class=>"rating", :id=>"4"}) %>
   <%= radio_button_tag("rating[value]", 4, current_user_rating == 4, :class => 'rating_button') %>

   <%= f.label("value_5", content_tag(:span, '5'), {:class=>"rating", :id=>"5"}) %>
   <%= radio_button_tag("rating[value]", 5, current_user_rating == 5, :class => 'rating_button') %>

   <%= hidden_field_tag("issue_id", issue.id) %>
   <%= f.submit :Submit, :style => "display:none" %>

 <% end %>

MODEL

class User < ActiveRecord::Base
  attr_accessible :name, :email, 

  has_many :ratings, dependent: :destroy
  has_many :rated_books, :through => :ratings, :source => :books

end

class Rating < ActiveRecord::Base
  attr_accessible :book_id, :user_id, :value

  belongs_to :user
  belongs_to :book

end

class Book < ActiveRecord::Base
  attr_accessible :description, :title

  has_many  :ratings
  has_many  :raters, :through => :ratings, :source => :users

end

CONTROLLER

class BooksController < ApplicationController

  respond_to :html, :js

  def show
    @book = Book.find(params[:id])
  end

  def index 
    @books = Book.all(:include => :ratings, :order => "book_number")
  end

end

1 个答案:

答案 0 :(得分:1)

当您浏览show时,您就拥有了这个:

@book = Book.find(params[:id])

所以大概你有助手所依赖的params[:id]。但是,当你到达params[:id]的部分时,为什么期望nil不是index?您通过对show中的内容做出错误假设,意外地将您的助手耦合到params控制器。

我的建议是(几乎)永远不会在辅助方法中访问params,如果通过参数尽可能多地传递帮助程序,您将拥有更清晰,更易维护(更不用说更少的错误)代码

你的助手看起来应该更像这样:

def rating_ballot(book_id)
  if @rating = current_user.ratings.find_by_book_id(book_id)
  #...

def current_user_rating(book_id)
  if @rating = current_user.ratings.find_by_book_id(book_id)
  #...

然后在你的部分你可以说:

Your Rating <%= current_user_rating(book.id) %>

我还建议您不要在帮助程序中使用@rating,只是使用杂散的实例变量污染您的命名空间(它们甚至没有明确的连接来自它们),只是改为使用本地rating变量。