2013-02-23 2 views
0

У меня есть простое приложение, которое позволяет пользователям загружать продукты, а затем комментировать эти продукты.Комментарии к списку товаров # index view

В настоящее время у меня есть страница #show с соответствующими комментариями к этому продукту. Так что эта часть работает. Кажется, что я не могу работать, я хотел бы показать комментарии для каждого продукта на странице #index продуктов.

Я думал, что то, что я работаю для представления # show, также будет работать для представления #index, но это не похоже на ситуацию в моей ситуации.

комментарии контроллер

def create 
    @product = Product.find(params[:product_id]) 
    @comment = @product.comments.build(params[:comment]) 
    @comment.user = current_user 
    if @comment.save 
    redirect_to @product, notice: "Comment was created." 
    else 
    render :new 
    end 
end 

Продукты Контроллер (я не уверен, что я должен положить в индексном действия здесь. Ничего я пытался работы. И @comments = @ product.comments бросает ошибку noMethod на «комментарии» на # указательным действия productController)

def index 
    @products = Product.all(:include => :comments) 
    #something about comments, nothing I've tried so far has worked 
    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @products } 
    end 
end 

def show 
    @product = Product.find(params[:id]) 
    @comment = Comment.new 
    @comment.user = current_user 
    respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @product } 
    end 
end 

Продукты # показать просмотреть (горе очий)

<div class="comment-wrapper"> 
     <ul class="comments"> 
      <%= render 'comments/comment' %> 
     <li> 
      <%= render 'comments/form' %> 
     </li> 
     </ul> 
    </div> 

Комментарии частичная _comment.html.erb (работа в продуктах # показать не работает на продукты # индекс)

<% @product.comments.each do |comment| %> 
<li> 
    <div class="comment-inner-wrapper"> 
    <div class="comment-controls"> 
    <% if comment.user == current_user %>   
     <%= link_to [@product, comment], :method => :delete, :confirm => "Are you sure?" do %> 
     <i class="icon-trash"></i> 
     <% end %> 
    <% end %> 
    </div> 
    <div class="comment-author-pic"> 
    <%= link_to comment.user do %> 
     <%= image_tag comment.user.image.url(:thumb) %> 
    <% end %> 
    </div> 
    <div class="comment-author"> 
    <%= link_to comment.user.username, comment.user %> 
    </div> 
    <div class="comment-content"> 
    <p><%= comment.content %></p> 
    </div> 
</div> 
</li> 

вид Продукция # индекс (Im повесила Вот. У меня есть форма, работающая для каждого продукта, и она выведет новый комментарий, но будет видна только в том случае, если вы перейдете на страницу #show. Комментарии обыкновение оказывать на представлении #index) я получаю ошибку неопределенный метод `комментарии для ноль: NilClass для линии № 1 из моих комментариев частичное _comment.html.erb

<div class="comment-wrapper"> 
     <ul class="comments"> 
      <%= render 'comments/comment' %> 
      <li> 
      <div class="comment-box-wrapper"> 
       <%= form_for [product, Comment.new], :remote => true do |f| %> 
       <div class="comment-textarea"> 
        <%= f.text_area :content %> 
       </div> 
       <div class="actions"> 
        <%= f.submit "Comment", :class => "btn btn-small pull-right" %> 
       </div> 
       <% end %> 
      </div> 
      </li> 
     </ul> 
    </div> 

Все мои модели отношения являются правильными. Любая помощь будет принята с благодарностью!

Редактировать Модели ниже

#product.rb 
has_many :comments, dependent: :destroy 

#comment.rb 
attr_accessible :content, :product_id, :user_id 

belongs_to :product 
belongs_to :user 

ответ

1

Я думаю, что есть проблема с моделями. Ниже приведен пример кода для продуктов и комментариев, что позволяет получить доступ комментарии для каждого продукта в индексной странице:

#product.rb 
class Product < ActiveRecord::Base 
    attr_accessible :name 
    has_many :comments 
end 

#comment.rb 
class Comment < ActiveRecord::Base 
    attr_accessible :product_id, :text 
    belongs_to :product 
end 

#products_controller.rb 
class ProductsController < ApplicationController 
    def index 
     @products = Product.all 
    end 
end 

EDIT Если вы хотите использовать частичное для комментариев должно быть что-то вроде этого.

#products/index.rb 
<% @products.each do |p| %> 
    <%= p.name %> 
    <%= render 'products/comments', :product => p %> 
<% end %> 

#_comments.html.erb 
<% product.comments.each do |c| %> 
    <%= c.text %> 
<% end %> 
+0

Спасибо за ответ! К сожалению, это приводит к той же ошибке, что и раньше. NoMethodError в продуктах # index undefined комментарий метода для nil: NilClass, Extracted source (вокруг строки # 16): '<% p.comments.each do | c | %> ' – itsthewrongway

+0

стр. Я опубликовал свои модели выше в редактировании. они уже были, как вы предполагали. – itsthewrongway

+0

Это, вероятно, означает, что комментариев экземпляра продукта, к которому вы пытаетесь получить доступ, не существует. Я думаю, что частичное для каждого комментария пробы пытается получить доступ к @product, который не обеспечивается действием контроллера индекса. Вы должны передать продукт частичным через свой индексный вид. –

Смежные вопросы