2017-03-28 9 views
0

私はユーザーが好きなアルバムを好きなようにデータベースに追加できるアプリがあります。だれでもそのアルバムのレビューを書き込んで書き込むことができます。ものすごく単純。Railsアプリ - 余分な記録表示

各アルバムの表示ページのレビュー用に余分なレコードが作成されているような問題が発生しています。すべてのアルバムは、まだレビューされていなくても、アルバムの各ページをアルバムショーページに表示するときに、空白のレビューが表示されます。私はそれを取り除きたい。

ここに問題のイメージがあります。私は赤でレビューを強調表示するためにCSSを使用しました。ご覧のとおり、一番下に空白のレビューがあります。問題のレビューを調べると、「まだレビューされていません」というタイトルが付けられています。ここで

enter image description here

私albums_controllerです:

<div class="row"> 
<div class="col-xs-10 col-md-6 col-md-push-3 col-xs-push-1 top bottom"> 
    <%= image_tag @album.cover, class: 'show_image' %> 
    <h2><%= @album.title %></h2> 
    <h4><%= @album.artist %></h4> 
    <h5><%= @album.year %></h5> 
    <p class="white">Average Review<div class="average-review-rating" data-score=<%= @average_review %>></div></p> 
    <% if user_signed_in? %> 
     <% if @album.user_id == current_user.id %> 
      <%= link_to 'Edit', edit_album_path(@album), class: 'grey' %> 
      | <%= link_to 'Delete', album_path, method: :delete, data: {confirm: "Are you sure?"}, class: 'grey' %> 
     <% end %> 
    <% end %> 
    <br /><br /> 
    <h4>Reviews</h4> 
    <% if user_signed_in? %> 
     <p class="grey">Write a review</p> 

     <%= form_for [@album, @review] do |r| %> 
      <div class="form-group"> 
       <div id="rating-form"> 
        <label>Rating</label> 
       </div> 
      </div> 
      <div class="form-group"> 
       <%= r.text_area :comment, class: 'form-control', placeholder: "Write a comment" %> 
      </div> 
      <div class="form-group"> 
       <%= r.submit "Create", class: 'btn btn-success' %> 
      </div> 
     <% end %> 
    <% end %> 

    <br /> 
    <% @album.reviews.each do |r| %> 
     <div class="red"> 
      <div class="review-rating" data-number="<%= r.rating %>"> 
      </div> 
      <p class="white"><%= r.comment %></p> 
      <% if user_signed_in? %> 
       <% if current_user.id == r.user_id %> 
        <%= link_to 'Edit', edit_album_review_path(@album, r.id), class: 'grey' %> | 
        <%= link_to 'Delete', album_review_path(@album, r.id), method: :delete, data: {confirm: "Are you sure?"}, class: 'grey' %> 
       <% end %> 
      <% end %> 
      <br /><br /> 
     </div> 
    <% end %> 
</div> 
</div> 



<script> 
$('.review-rating').raty({ 
readOnly: true, 
score: function() { 
    return $(this).attr('data-number'); 
}, 
path: '/assets/' 
}); 

$('#rating-form').raty({ 
path: '/assets/', 
scoreName: 'review[rating]' 
}); 

$('.average-review-rating').raty({ 
readOnly: true, 
path: '/assets/', 
score: function() { 
    return $(this).attr('data-score') 
} 
}); 
</script> 

すべてのヘルプは非常に次のようになります。ここでは

class AlbumsController < ApplicationController 
    before_action :set_album, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user!, only: [:edit, :new, :update, :destroy] 

    def index 
    @albums = Album.all 
    if params[:search].nil? 
     @albums = Album.all.order(year: :desc).order(title: :asc).paginate(:page => params[:page], :per_page => 24) 
    else 
     @albums = @albums.where("albums.title || albums.year || albums.artist LIKE ?", "%#{params[:search]}%").order(year: :desc).order(title: :asc).paginate(:page => params[:page], :per_page => 24) 
    end 
    end 

    def show 
    if @album.reviews.blank? 
     @average_review = 0 
    else 
     @average_review = @album.reviews.average(:rating).round(2) 
    end 
    @review = @album.reviews.build 
    end 

    def new 
    @album = Album.new 
    end 

    def edit 

    end 

    def create 
    @album = current_user.albums.build(album_params) 

    respond_to do |format| 
     if @album.save 
     format.html { redirect_to @album, notice: 'Album was successfully created.' } 
     format.json { render :show, status: :created, location: @album } 
     else 
     format.html { render :new } 
     format.json { render json: @album.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @album.update(album_params) 
     format.html { redirect_to @album, notice: 'Album was successfully updated.' } 
     format.json { render :show, status: :ok, location: @album } 
     else 
     format.html { render :edit } 
     format.json { render json: @album.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @album.destroy 
    respond_to do |format| 
     format.html { redirect_to albums_url, notice: 'Album was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

private 
# Use callbacks to share common setup or constraints between actions. 

def set_album 
    @album = Album.find(params[:id]) 
end 

def album_params 
    params.require(:album).permit(:title, :artist, :year, :cover) 
end 
end 

は、余分なレビューが表示されているところであるアルバムのショーのページは、あります感謝!

+0

私はちょうど前に行くと愚かな質問をして、そこに空のレビューを持っていないことを確認するためにデータベースをチェックしたのですか? – sammms

答えて

1

ここの問題はshowメソッドの最後の行にあります:@review = @album.reviews.build。この行は、新しいReviewインスタンスを作成し、@reviewに割り当てますが、そのインスタンスを配列@album.reviewsに追加します。つまり、@album.reviewsを繰り返したときに、すべての永続化されたレビューだけでなく、buildで構築された新しい永続化されていないレビューも表示されます。

この問題を解決する最も簡単な方法は、あなたのビューでは、この行を追加することです:

<% @album.reviews.each do |r| %> 
    <% next unless r.persisted? %> 

別の解決策はなく、@albumインスタンス上で、アルバムで新しいレビューを関連付けることであろう。コントローラーで:

@review = Review.new(album: @album) 
+0

非常に徹底的な答えをありがとう! –

0

最後の行がshowである可能性があります。

@review = @album.reviews.build 

これは空のレビューを作成します。

関連する問題