我使用本教程实施了星级评分系统 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
答案 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
变量。