0

このチュートリアルを使用して星評価システムを実装しました 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 (書籍)

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

index.html.erb (本)

  <% @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 %>

モデル

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

コントローラ

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
4

1 に答える 1

1

を通過するshowと、次のようになります。

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

params[:id]おそらく、ヘルパーが依存するを持っていると思います。しかし、パーシャル スルーに到達したときparams[:id]以外のことを期待するのはなぜでしょうか。の内容について誤った仮定を行うことで、誤ってヘルパーをコントローラーに結合してしまいました。nilindexshowparams

私のアドバイスは、(ほとんど)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代わりにローカル変数を使用することをお勧めします。

于 2014-01-02T03:21:58.253 に答える