1
votes

Albums have many reviews and users through reviews, Reviews belong to album and belong to user, and Users have many reviews and have many albums through reviews.

On my albums show page, Reviews do not display. But Reviews display on the reviews index page. I can't seem to figure out what I'm missing. I'm not getting any errors.

Here is my Albums controller:

class AlbumsController < ApplicationController
    before_action :set_album, only: [:show, :edit, :update]

    def index
        @albums = Album.all
        @current_user
    end

    def show
        @review = @album.reviews.build
    end

    def new
        @album = Album.new
    end

    def create
        @album = Album.new(album_params)
        if @album.save
            redirect_to album_path(@album)
        else
            render :new
        end
    end

    def edit
    end

    def update
        if @album.update(album_params)
            redirect_to album_path(@album), notice: "Your album has been updated."
        else
            render 'edit'
        end
    end

    private

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

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

Reviews Controller:

class ReviewsController < ApplicationController

    def index
        @reviews = Review.all
    end

    def show
        @review = Review.find(params[:id])
        #@reviews = Review.where("album_id = ?", params[:album_id])
    end

    def new
        @review = Review.new
    end

    def create
        @review = current_user.reviews.build(review_params)
        if @review.save
            redirect_to reviews_path
        else
            render :new
        end
    end

    def update

    end

    private

    def review_params
        params.require(:review).permit(:title, :date, :content, :user_id, :album_id, album_attributes:[:artist, :title])
    end

end

Here is my albums show page:

<% if @album.avatar.attached? %>
    <image src="<%=(url_for(@album.avatar))%>%" style="width:350px;height:350px;">
<% end %>
<br>
<%= @album.artist %> -
<%= @album.title %>
<br>
<%= link_to "Edit Album", edit_album_path %>
<br><br><br>

<%= render '/reviews/form' if logged_in? %>
    <h3>Album Reviews</h3>
<% @album.reviews.each do |review| %>
        <%= review.title %>
        <%= review.content %>
<% end %>

<br><br><br>
<%= link_to "All Albums", albums_path %><br>
<%= link_to "Upload a New Album", new_album_path %>

Here is my routes file:

Rails.application.routes.draw do

  get '/signup' => 'users#new', as: 'signup'
  post '/signup' => 'users#create'
  get '/signin' => 'sessions#new'
  post '/signin' => 'sessions#create'
  get '/signout' => 'sessions#destroy'

  resources :albums do
    resources :reviews, except: [:index]
  end
  resources :users
  resources :reviews, only: [:index]

  root to: "albums#index"
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

Here are my Models:

class Album < ApplicationRecord
    has_many :reviews
    has_many :users, through: :reviews
    has_one_attached :avatar
end

class Review < ApplicationRecord
    belongs_to :album, optional: true
    belongs_to :user
    accepts_nested_attributes_for :album
end

class User < ApplicationRecord
    has_secure_password
    has_many :reviews
    has_many :albums, through: :reviews
    accepts_nested_attributes_for :reviews
end

Review form:

<%= form_for :review, method: "POST",:url => { :action => :create } do |f| %> 
<!-- <%= f.collection_select :album_id, Album.order(:artist),:id,:artist %> -->
<br>
      <%= f.label :title %>
      <%= f.text_field :title%>
            <br><br>
      <%= f.label :date %>
      <%= f.datetime_field :date%>
            <br><br>
      <%= f.label :content %>
      <%= f.text_area :content %>
            <br><br>
      <%= f.submit "Submit" %>
<% end %>
1
The most important part is your models and they missing please add them as well, also add your migration files.matanco

1 Answers

-1
votes

The problem is the iteration, because you use the instance variable coming from the controller instead of the block variable, it should be:

<% @album.reviews.each do |review| %>
  <%= review.title %>
  <%= review.content %>
<% end %>

@review is a new instance of a review (empty) which you created for the form I guess.

So instead of showing each review's title and content you showed the one from the empty review saved in @review in each iteration.