books edition by admin

This commit is contained in:
Karol Selak 2021-03-21 20:30:25 +01:00
parent 5095f63fd7
commit e36cc36947
10 changed files with 119 additions and 20 deletions

View file

@ -0,0 +1,5 @@
class AuthorsController < ApplicationController
def index
@authors = Author.all
end
end

View file

@ -1,5 +1,43 @@
class BooksController < ApplicationController
before_action :set_book, only: [:show, :edit, :update]
before_action :ensure_admin, only: [:edit, :update]
def index
@books = Book.published.map { |book| BooksPresenter.new(book) }
if current_user.admin?
books = Book.all
else
books = Book.published
end
@books = books.map { |book| BooksPresenter.new(book) }
end
def show
end
def edit
end
def update
if @book.update(book_params)
redirect_to '/books'
end
end
private
def ensure_admin
unless current_user&.admin?
redirect_to '/welcome', notice: 'You are not allowed to perform this action'
end
end
def set_book
@book = BooksPresenter.new(Book.find(params[:id]))
end
def book_params
result = params.require(:book).permit(:title, :price, :published)
result['price'] = result['price'].to_d * 100
result
end
end

View file

@ -4,5 +4,4 @@ class Book < ApplicationRecord
scope :published, -> { where(published: true) }
validates :title, presence: true
validates :price, presence: true
validates :published, presence: true
end

View file

@ -5,5 +5,9 @@ class User < ApplicationRecord
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
validates :role, presence: true
validates :password, presence: true, length: { minimum: 8 }
validates :password, {
presence: true,
length: { minimum: 8 },
if: lambda{ new_record? || !password.nil? }
}
end

View file

@ -2,7 +2,11 @@ class BooksPresenter < SimpleDelegator
include ActiveSupport::NumberHelper
def price
number_to_currency(super / 100)
super / 100
end
def price_with_currency
number_to_currency(price)
end
def authors

View file

@ -0,0 +1,14 @@
<h4>Edit book</h4>
<%= form_for @book do |f|%>
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :price %>
<%= f.number_field :price, step: 0.01 %>
<label>
<div>
<%= f.check_box :published, class: 'filled-in' %>
<span>published</span>
</div>
</label>
<%= f.submit 'Save changes', class: 'btn' %>
<%end%>

View file

@ -1,17 +1,27 @@
<div class='container'>
<% @books.each do |book| %>
<div class='row'>
<div class='col s4'>
Title: <%= book.title %>
<div class='col s3'>
Title: <%= link_to book.title, book %>
</div>
<div class='col s4'>
Price: <%= book.price %>
<div class='col s3'>
Price: <%= book.price_with_currency %>
</div>
<div class='col s4'>
<div class='col s3'>
Authors: <%= book.authors %>
</div>
<% if current_user.admin? %>
<div class='col s2'>
<%= book.published ? 'published' : 'unpublished' %>
</div>
<div class='col s1'>
<%= link_to 'Edit', edit_book_path(book), class: "btn" %>
</div>
<% end %>
</div>
<% end %>
</div>

View file

@ -0,0 +1,20 @@
<div class='container'>
<div class='row'>
<div class='col s4'>
Title: <%= link_to @book.title, @book %>
</div>
<div class='col s4'>
Price: <%= @book.price_with_currency %>
</div>
<div class='col s4'>
Authors: <%= @book.authors %>
</div>
</div>
<% if current_user&.admin? %>
<div class='row'>
<%= link_to 'Edit', edit_book_path(@book), class: "btn" %>
</div>
<% end %>
</div>

View file

@ -12,6 +12,7 @@
<body>
<%= link_to 'Home', '/welcome', method: :get%>
<%= link_to 'Books', '/books', method: :get%>
<% flash.each do |type, notice| %>
<div class='card-panel teal lighten-5'>
<% if notice.is_a? String %>

View file

@ -31,21 +31,25 @@ authors = Author.create([
},
])
BookAuthor.create([
books.first.authors << authors.first
books.second.authors << authors.first
books.third.authors << authors.second
books.third.authors << authors.third
User.create([
{
book: books.first,
author: authors.first
email: 'abc@o2.pl',
password: 'aaaaaaaa',
role: :admin
},
{
book: books[1],
author: authors.first
email: 'abcd@o2.pl',
password: 'aaaaaaaa',
role: :customer
},
{
book: books[2],
author: authors[1]
},
{
book: books[2],
author: authors[2]
email: 'abcde@o2.pl',
password: 'aaaaaaaa',
role: :customer
},
])