Bryan
Bryan

Reputation: 65

How to lists all names from a specific category in Rails?

I have been looking for the right answer, but no success. So I have a list where people can sign the list and select a specific barber. I want to display all the names under a specific Barber in my views/barbers/show.html.erb I am new to rails so I would really appreciate anyone's help. Thank You :)

Here is my lists controller:

class ListsController < ApplicationController
  before_action :find_list, only: [:show, :edit, :update, :destroy]
  def index
    @list = List.all.order("created_at asc")
  end

  def new
    @list = List.new
  end

  def create
    @list = List.new list_params

    if @list.save
      redirect_to root_path, notice: "#{@list.name}, You have been added to the List!"
    else
      render 'new', notice: "Oh No! Not Saved!"
    end
  end

  def show

  end

  def edit

  end

  def update
    if @list.update list_params
      redirect_to @list, notice: "#{@list.name}, has been updated!"
    else
      render 'edit'
    end
  end

  def destroy
    @list.destroy
    redirect_to root_path, notice: "#{@list.name}, has been deleted!"
  end

  private

  def list_params
    params.require(:list).permit(:name, :barber_id)
  end

  def find_list
    @list = List.find(params[:id])
  end

end

Barbers Controller:

class BarbersController < ApplicationController
  before_action :find_barber, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!
  def index
    @barber = Barber.all.order("created_at desc")
  end

  def new
    @barber = Barber.new
  end

  def create
    @barber = Barber.new barber_params

    if @barber.save
      redirect_to @barber, notice: "#{@barber.name} has been saved!"
    else
      render 'new', notice: "Oh No!#{@barber.name} couldn't save!"
    end
  end

  def show

  end

  def edit

  end

  def update
    if @barber.update barber_params
      redirect_to @barber, notice: "#{@barber.name} has been updated"
    else
      render 'edit'
    end
  end

  def destroy
    @barber.destroy
    redirect_to barbers_path
  end

  private

  def barber_params
    params.require(:barber).permit(:name, :barber_id)
  end

  def find_barber
    @barber = Barber.find(params[:id])
  end

end

Barbers Model:

class Barber < ActiveRecord::Base
  has_many :lists
end

Lists Model:

class List < ActiveRecord::Base
  has_one :barber
  belongs_to :barber
end

Show.html.erb:

<div class="container">
  <div class="row">
    <div class="col-md-10 list center-block">
      <div class="col-md-6 center-block names panel-default panel">
        <h1><%= @barber.name %></h1>
        <hr>
      </div>
      <div class="col-md-2 center-block">
        <%= link_to "edit", edit_barber_path(@barber), class: "btn btn-default btn-edit"%>
        <%= link_to "Delete", barber_path(@barber), method: :delete, data: {confirm: "Are you sure you want to delete this Barber?"}, class: "btn btn-default btn-delete"%>
      </div>
    </div>
  </div>
</div>

And here is my form just in case:

<%= form_for @list do |f| %>
  <% if @list.errors.any?%>
    <h2><%= pluralize(@list.errors.count, "error") %> prevented this list from saving:</h2>
    <ul>
      <% @list.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <%end%>
    </ul>
  <%end%>

  <div class="form-group ">
    <%= f.label :name %>
    <%= f.text_field :name, {class: 'form-control'} %>
  </div>

  <div class="form-group">
    <%= f.label "Choose a Barber" %>

    <div class="classic-select">
      <%= f.collection_select :barber_id, Barber.all, :id, :name %>
    </div>

  </div>
  <br>
  <button type="submit" class="btn-add-to-list">Submit</button>
<%end%>

Upvotes: 0

Views: 47

Answers (1)

blnc
blnc

Reputation: 4404

Lists Model:

class List < ActiveRecord::Base
  # REMOVE THIS: has_one :barber
  belongs_to :barber
end

Show.html.erb:

<div class="container">
  <div class="row">
    <div class="col-md-10 list center-block">
      <div class="col-md-6 center-block names panel-default panel">
        <h1><%= @barber.name %></h1>
        <% for list in @barber.lists %>
            <p><%= list.name %></p>
        <% end %>
        <hr>
      </div>
      <div class="col-md-2 center-block">
        <%= link_to "edit", edit_barber_path(@barber), class: "btn btn-default btn-edit"%>
        <%= link_to "Delete", barber_path(@barber), method: :delete, data: {confirm: "Are you sure you want to delete this Barber?"}, class: "btn btn-default btn-delete"%>
      </div>
    </div>
  </div>
</div>

Upvotes: 1

Related Questions