2017-11-28 3 views
1

私は、スプリーバックエンドで製品のレビューを掲載しようとしています。しかし、エラー '未定義のメソッドを取得する'。私はルビーに新しいです、この問題を解決するために私を助けてください。ルビーエラー:未定義メソッド `any 'for 30:Fixnum(NoMethodError)

ありがとうございました。

Index.html.erb:

<% if @reviews.any? %> 
<table class="index"> 
    <colgroup> 
     <col style="width: 25%;"> 
     <col style="width: 10%;"> 
     <col style="width: 10%;"> 
     <col style="width: 20%;"> 
     <col style="width: 15%;"> 
     <col style="width: 17%;"> 
    </colgroup> 
    <thead> 
     <tr> 
      <th><%= Spree.t('product') %></th> 
      <th><%= Spree::Review.human_attribute_name(:rating) %></th> 
      <th><%= Spree.t('feedback') %></th> 
      <th><%= Spree::Review.human_attribute_name(:user) %></th> 
      <th><%= Spree::Review.human_attribute_name(:created_at) %></th> 
     </tr> 
    </thead> 
    <tbody> 
    <%- @reviews.each do |review| -%> 
     <tr id="<%= dom_id review %>"> 
      <td> 
       <% if review.product %> 
        <%= link_to review.product.name, product_path(review.product) %> 
       <% end %> 
      </td> 
      <td class="align-center"> 
       <%= txt_stars(review.rating) %> 
      </td> 
      <td class="align-center"> 
       <%= link_to "(#{review.feedback_stars}/#{review.feedback_reviews.size})", admin_review_feedback_reviews_path(review) %> 
      </td> 
      <td class="align-center"> 
       <%= review.user_id ? link_to(review.user.try(:email), [:admin, review.user]) : Spree.t(:anonymous) %></p> 
       <p><%= Spree::Review.human_attribute_name(:ip_address) %>: <%= review.ip_address ? link_to(review.ip_address, "http://whois.domaintools.com/#{review.ip_address}") : '-' %></p> 
      </td> 
      <td class="align-center"> 
       <%= l review.created_at, :format => :short %> 
      </td> 
      <td class="actions"> 
       <%= link_to_with_icon 'check', Spree.t('approve'), approve_admin_review_url(review), :no_text => true, class: 'approve' unless review.approved %> 
       &nbsp; 
       <%= link_to_edit review, :no_text => true, :class => 'edit' %> 
       &nbsp; 
       <%= link_to_delete review, :no_text => true %> 
      </td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 
<% else %> 
<div class="no-objects-found"> 
    <%= Spree.t(:no_results) %> 
</div> 
<% end %> 

上記のようにリストindex.html.erbファイル、で、検索を掻き回す行われます。

モデルファイル:review.rb

class Spree::Review < ActiveRecord::Base 

     belongs_to :product, touch: true 
     belongs_to :user, :class_name => Spree.user_class.to_s 
     has_many :feedback_reviews 

     after_save :recalculate_product_rating, :if => :approved? 
     after_destroy :recalculate_product_rating 

     validates :name, presence: true 
     validates :review, presence: true 

     validates :rating, numericality: { only_integer: true, 
     greater_than_or_equal_to: 1, 
     less_than_or_equal_to: 5, 
     message: Spree.t('you_must_enter_value_for_rating') } 


     default_scope { order("spree_reviews.created_at DESC") } 

     scope :localized, ->(lc) { where('spree_reviews.locale = ?', lc) } 
     scope :most_recent_first, -> { order('spree_reviews.created_at DESC') } 
     scope :oldest_first, -> { reorder('spree_reviews.created_at ASC') } 
     scope :preview, -> { limit(Spree::Reviews::Config[:preview_size]).oldest_first } 
     scope :approved, -> { where(approved: true) } 
     scope :not_approved, -> { where(approved: false) } 
     scope :default_approval_filter, -> { Spree::Reviews::Config[:include_unapproved_reviews] ? all : approved } 

     def feedback_stars 
     return 0 if feedback_reviews.size <= 0 
     ((feedback_reviews.sum(:rating)/feedback_reviews.size) + 0.5).floor 
     end 

     def set_search 
     @search=Product.search(params[:q]) 
     end 

     def recalculate_product_rating 
     self.product.recalculate_rating if product.present? 
     end 
     end 

reviews_controller.rb

  class Spree::Admin::ReviewsController < Spree::Admin::ResourceController 
     helper Spree::ReviewsHelper 

     def index 
     @reviews = collection 
     end 

     def approve 
     r = Spree::Review.find(params[:id]) 

     if r.update_attribute(:approved, true) 
     flash[:notice] = Spree.t("info_approve_review") 
     else 
     flash[:error] = Spree.t("error_approve_review") 
     end 
     redirect_to admin_reviews_path 
     end 

     def edit 
     if @review.product.nil? 
     flash[:error] = Spree.t("error_no_product") 
     redirect_to admin_reviews_path and return 
     end 
     end 

     private 

     def collection 
     params[:q] ||= {} 
     @search = Spree::Review.ransack(params[:q]) 
     @collection = @search.result.includes([:product, :user, :feedback_reviews]).page(params[:page]).per(params[:per_page]) 
     end 
     end 
+1

コントローラー/ビュー、特に '@ reviews'を割り当てた行を表示します。整数値が割り当てられていることが分かりました。 _Sidenote:_ "私は何にでも新しい"という言い訳をしてはいけません。 – mudasobwa

+1

あなたは@reviewsで間違った価値を得ています。修正番号の代わりに配列番号 –

+0

質問が更新されました(コントローラファイルが追加されました)。それを確認してください – Cliffs

答えて

-1

any上のアレイを持つ作品とあなたの@reviewsが配列ではありません。 @reviewsオブジェクトを確認してください。配列でなければなりません。

+0

これはコメントであり、答えではありません。 – mudasobwa

+0

@Sachin R、@reviewsをチェックしたとき、 '<%= @ reviews.inspect%>'の値は〜30の整数です。値の配列が得られません。そのコントローラで定義されている 'def collection params [:q] || = {} @search = Spree :: Review.ransack(params [:q]) @collection = @ search.result.includes([:product (params [:page]) end' – Cliffs

+0

メソッドの名前をコレクションから別の名前に変更できますか? 多分それはいくつかのルビーメソッドを競合するでしょう。 –

0

重要なコードは、解読が非常に難しいあなたのコメントにあります。

私はあなたがそうそれを修正するために(別の変数である)

を整数IDを変数collectionを割り当て、およびデータベース検索場合@collectionに結果を割り当てたあなたは

にindexアクションを変更することができると思い

@reviews = @collection 
+0

は '@reviews = @ collection'に変更しようとしました。しかし、変更はありません。私はコントローラーとモデルを変更しました。it.thereに電車を持ってください。私は明確にdefコレクションのコードを書いています。 – Cliffs

関連する問題