From 9a10f3db12a00adea471ec879a837bba269d9c3b Mon Sep 17 00:00:00 2001 From: badraih Date: Tue, 12 Mar 2019 18:05:22 +0300 Subject: [PATCH] some bootstrap added first: added comment inside each book to allow any user to write his comments. second: added nav bar in all pages and redirect users to the page they click on third: had been changing the login link position to be inside navbar fourth: displayed books as cards in home page (image ,title, author) fifth: redirect users to book details page when they click on the title --- Gemfile | 6 +- Gemfile.lock | 46 +++ app/assets/javascripts/books.js | 2 + app/assets/javascripts/comments.js | 2 + app/assets/javascripts/home.js | 2 + .../{application.css => application.scss} | 7 +- app/assets/stylesheets/books.scss | 3 + app/assets/stylesheets/comments.scss | 3 + app/assets/stylesheets/home.scss | 4 + app/assets/stylesheets/scaffolds.scss | 84 +++++ app/controllers/books_controller.rb | 92 ++++++ app/controllers/comments_controller.rb | 16 + app/controllers/home_controller.rb | 15 + app/helpers/books_helper.rb | 2 + app/helpers/comments_helper.rb | 2 + app/helpers/home_helper.rb | 2 + app/models/application_record.rb | 2 + app/models/book.rb | 5 + app/models/comment.rb | 3 + app/models/user.rb | 10 + app/uploaders/image_uploader.rb | 53 ++++ app/views/books/_book.json.jbuilder | 2 + app/views/books/_form.html.erb | 43 +++ app/views/books/edit.html.erb | 9 + app/views/books/index.html.erb | 33 ++ app/views/books/index.json.jbuilder | 1 + app/views/books/new.html.erb | 5 + app/views/books/show.html.erb | 46 +++ app/views/books/show.json.jbuilder | 1 + app/views/comments/_comment.html.erb | 10 + app/views/comments/_form.html.erb | 16 + app/views/home/index.html.erb | 33 ++ app/views/layouts/application.html.erb | 33 +- config/application.rb | 2 + config/environments/development.rb | 1 + config/initializers/carrier_wave.rb | 1 + config/initializers/devise.rb | 299 ++++++++++++++++++ config/locales/devise.en.yml | 65 ++++ config/locales/en.yml | 2 + config/routes.rb | 12 +- db/migrate/20190307143154_create_books.rb | 13 + .../20190307144301_devise_create_users.rb | 44 +++ .../20190310114844_add_user_to_books.rb | 5 + ...0153_change_image_to_be_binary_in_books.rb | 12 + db/migrate/20190312081807_create_comments.rb | 11 + db/schema.rb | 53 ++++ db/seeds.rb | 2 + ...-stock-photo-programming-works-concept.jpg | Bin 0 -> 89346 bytes test/controllers/books_controller_test.rb | 48 +++ test/controllers/comments_controller_test.rb | 14 + test/controllers/home_controller_test.rb | 9 + test/fixtures/books.yml | 15 + test/fixtures/comments.yml | 11 + test/fixtures/users.yml | 11 + test/models/book_test.rb | 7 + test/models/comment_test.rb | 7 + test/models/user_test.rb | 7 + test/system/books_test.rb | 51 +++ 58 files changed, 1288 insertions(+), 7 deletions(-) create mode 100644 app/assets/javascripts/books.js create mode 100644 app/assets/javascripts/comments.js create mode 100644 app/assets/javascripts/home.js rename app/assets/stylesheets/{application.css => application.scss} (90%) create mode 100644 app/assets/stylesheets/books.scss create mode 100644 app/assets/stylesheets/comments.scss create mode 100644 app/assets/stylesheets/home.scss create mode 100644 app/assets/stylesheets/scaffolds.scss create mode 100644 app/controllers/books_controller.rb create mode 100644 app/controllers/comments_controller.rb create mode 100644 app/controllers/home_controller.rb create mode 100644 app/helpers/books_helper.rb create mode 100644 app/helpers/comments_helper.rb create mode 100644 app/helpers/home_helper.rb create mode 100644 app/models/book.rb create mode 100644 app/models/comment.rb create mode 100644 app/models/user.rb create mode 100644 app/uploaders/image_uploader.rb create mode 100644 app/views/books/_book.json.jbuilder create mode 100644 app/views/books/_form.html.erb create mode 100644 app/views/books/edit.html.erb create mode 100644 app/views/books/index.html.erb create mode 100644 app/views/books/index.json.jbuilder create mode 100644 app/views/books/new.html.erb create mode 100644 app/views/books/show.html.erb create mode 100644 app/views/books/show.json.jbuilder create mode 100644 app/views/comments/_comment.html.erb create mode 100644 app/views/comments/_form.html.erb create mode 100644 app/views/home/index.html.erb create mode 100644 config/initializers/carrier_wave.rb create mode 100644 config/initializers/devise.rb create mode 100644 config/locales/devise.en.yml create mode 100644 db/migrate/20190307143154_create_books.rb create mode 100644 db/migrate/20190307144301_devise_create_users.rb create mode 100644 db/migrate/20190310114844_add_user_to_books.rb create mode 100644 db/migrate/20190311120153_change_image_to_be_binary_in_books.rb create mode 100644 db/migrate/20190312081807_create_comments.rb create mode 100644 db/schema.rb create mode 100644 public/uploads/book/image/11/depositphotos_87331584-stock-photo-programming-works-concept.jpg create mode 100644 test/controllers/books_controller_test.rb create mode 100644 test/controllers/comments_controller_test.rb create mode 100644 test/controllers/home_controller_test.rb create mode 100644 test/fixtures/books.yml create mode 100644 test/fixtures/comments.yml create mode 100644 test/fixtures/users.yml create mode 100644 test/models/book_test.rb create mode 100644 test/models/comment_test.rb create mode 100644 test/models/user_test.rb create mode 100644 test/system/books_test.rb diff --git a/Gemfile b/Gemfile index bf629fa..b28fb15 100644 --- a/Gemfile +++ b/Gemfile @@ -9,20 +9,22 @@ gem 'rails', '~> 5.2.2' gem 'pg', '>= 0.18', '< 2.0' # Use Puma as the app server gem 'puma', '~> 3.11' +gem 'pry-rails', :group => :development # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' +gem 'devise', '~> 4.6', '>= 4.6.1' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby - +gem 'carrierwave', '~> 1.0' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' - +gem 'bootstrap' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' diff --git a/Gemfile.lock b/Gemfile.lock index adbb6d4..b4eb186 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -47,9 +47,16 @@ GEM archive-zip (0.12.0) io-like (~> 0.3.0) arel (9.0.0) + autoprefixer-rails (9.4.10.2) + execjs + bcrypt (3.1.12) bindex (0.5.0) bootsnap (1.4.1) msgpack (~> 1.0) + bootstrap (4.3.1) + autoprefixer-rails (>= 9.1.0) + popper_js (>= 1.14.3, < 2) + sassc-rails (>= 2.0.0) builder (3.2.3) byebug (11.0.0) capybara (3.14.0) @@ -60,13 +67,24 @@ GEM rack-test (>= 0.6.3) regexp_parser (~> 1.2) xpath (~> 3.2) + carrierwave (1.3.1) + activemodel (>= 4.0.0) + activesupport (>= 4.0.0) + mime-types (>= 1.16) childprocess (0.9.0) ffi (~> 1.0, >= 1.0.11) chromedriver-helper (2.1.0) archive-zip (~> 0.10) nokogiri (~> 1.8) + coderay (1.1.2) concurrent-ruby (1.1.4) crass (1.0.4) + devise (4.6.1) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 4.1.0, < 6.0) + responders + warden (~> 1.2.3) erubi (1.8.0) execjs (2.7.0) ffi (1.10.0) @@ -90,6 +108,9 @@ GEM marcel (0.3.3) mimemagic (~> 0.3.2) method_source (0.9.2) + mime-types (3.2.2) + mime-types-data (~> 3.2015) + mime-types-data (3.2018.0812) mimemagic (0.3.3) mini_mime (1.0.1) mini_portile2 (2.4.0) @@ -99,7 +120,14 @@ GEM nio4r (2.3.1) nokogiri (1.10.1) mini_portile2 (~> 2.4.0) + orm_adapter (0.5.0) pg (1.1.4) + popper_js (1.14.5) + pry (0.12.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.9) + pry (>= 0.10.4) public_suffix (3.0.3) puma (3.12.0) rack (2.0.6) @@ -134,6 +162,9 @@ GEM rb-inotify (0.10.0) ffi (~> 1.0) regexp_parser (1.3.0) + responders (2.4.1) + actionpack (>= 4.2.0, < 6.0) + railties (>= 4.2.0, < 6.0) ruby_dep (1.5.0) rubyzip (1.2.2) sass (3.7.3) @@ -147,6 +178,15 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) + sassc (2.0.1) + ffi (~> 1.9) + rake + sassc-rails (2.1.0) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt selenium-webdriver (3.141.0) childprocess (~> 0.5) rubyzip (~> 1.2, >= 1.2.2) @@ -169,6 +209,8 @@ GEM thread_safe (~> 0.1) uglifier (4.1.20) execjs (>= 0.3.0, < 3) + warden (1.2.8) + rack (>= 2.0.6) web-console (3.7.0) actionview (>= 5.0) activemodel (>= 5.0) @@ -185,12 +227,16 @@ PLATFORMS DEPENDENCIES bootsnap (>= 1.1.0) + bootstrap byebug capybara (>= 2.15) + carrierwave (~> 1.0) chromedriver-helper + devise (~> 4.6, >= 4.6.1) jbuilder (~> 2.5) listen (>= 3.0.5, < 3.2) pg (>= 0.18, < 2.0) + pry-rails puma (~> 3.11) rails (~> 5.2.2) sass-rails (~> 5.0) diff --git a/app/assets/javascripts/books.js b/app/assets/javascripts/books.js new file mode 100644 index 0000000..dee720f --- /dev/null +++ b/app/assets/javascripts/books.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/comments.js b/app/assets/javascripts/comments.js new file mode 100644 index 0000000..dee720f --- /dev/null +++ b/app/assets/javascripts/comments.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/home.js b/app/assets/javascripts/home.js new file mode 100644 index 0000000..dee720f --- /dev/null +++ b/app/assets/javascripts/home.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.scss similarity index 90% rename from app/assets/stylesheets/application.css rename to app/assets/stylesheets/application.scss index d05ea0f..e0411be 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.scss @@ -10,6 +10,9 @@ * files in this directory. Styles in this file should be added after the last require_* statement. * It is generally better to create a new file per style scope. * - *= require_tree . - *= require_self + */ + + @import 'bootstrap'; + @import 'books.scss'; + @import 'home.scss'; \ No newline at end of file diff --git a/app/assets/stylesheets/books.scss b/app/assets/stylesheets/books.scss new file mode 100644 index 0000000..9fab565 --- /dev/null +++ b/app/assets/stylesheets/books.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Books controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/comments.scss b/app/assets/stylesheets/comments.scss new file mode 100644 index 0000000..e730912 --- /dev/null +++ b/app/assets/stylesheets/comments.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Comments controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss new file mode 100644 index 0000000..37de44d --- /dev/null +++ b/app/assets/stylesheets/home.scss @@ -0,0 +1,4 @@ +// Place all the styles related to the home controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + diff --git a/app/assets/stylesheets/scaffolds.scss b/app/assets/stylesheets/scaffolds.scss new file mode 100644 index 0000000..6045188 --- /dev/null +++ b/app/assets/stylesheets/scaffolds.scss @@ -0,0 +1,84 @@ +body { + background-color: #fff; + color: #333; + margin: 33px; + font-family: verdana, arial, helvetica, sans-serif; + font-size: 13px; + line-height: 18px; +} + +p, ol, ul, td { + font-family: verdana, arial, helvetica, sans-serif; + font-size: 13px; + line-height: 18px; +} + +pre { + background-color: #eee; + padding: 10px; + font-size: 11px; +} + +a { + color: #000; + + &:visited { + color: #666; + } + + &:hover { + color: #fff; + background-color: #000; + } +} + +th { + padding-bottom: 5px; +} + +td { + padding: 0 5px 7px; +} + +div { + &.field, &.actions { + margin-bottom: 10px; + } +} + +#notice { + color: green; +} + +.field_with_errors { + padding: 2px; + background-color: red; + display: table; +} + +#error_explanation { + width: 450px; + border: 2px solid red; + padding: 7px 7px 0; + margin-bottom: 20px; + background-color: #f0f0f0; + + h2 { + text-align: left; + font-weight: bold; + padding: 5px 5px 5px 15px; + font-size: 12px; + margin: -7px -7px 0; + background-color: #c00; + color: #fff; + } + + ul li { + font-size: 12px; + list-style: square; + } +} + +label { + display: block; +} diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb new file mode 100644 index 0000000..2fe798b --- /dev/null +++ b/app/controllers/books_controller.rb @@ -0,0 +1,92 @@ +class BooksController < ApplicationController + before_action :authenticate_user!,except: [:index, :show] + before_action :set_book, only: [:show, :edit, :update, :destroy] + # + + # GET /books + # GET /books.json + def index + if current_user + @books = current_user.books + else + redirect_to home_path + end + end + + # GET /books/1 + # GET /books/1.json + def show + user_edit + end + + # GET /books/new + def new + @book = Book.new + end + + # GET /books/1/edit + def edit + user_edit + end + + # POST /books + # POST /books.json + def create + @book = current_user.books.build(book_params) + respond_to do |format| + if @book.save + format.html { redirect_to @book, notice: 'Book was successfully created.' } + format.json { render :show, status: :created, location: @book } + else + format.html { render :new } + format.json { render json: @book.errors, status: :unprocessable_entity } + end + end + + end + + # PATCH/PUT /books/1 + # PATCH/PUT /books/1.json + def update + respond_to do |format| + if @book.update(book_params) + format.html { redirect_to @book, notice: 'Book was successfully updated.' } + format.json { render :show, status: :ok, location: @book } + else + format.html { render :edit } + format.json { render json: @book.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /books/1 + # DELETE /books/1.json + def destroy + @book.destroy + respond_to do |format| + format.html { redirect_to books_url, notice: 'Book was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_book + @book = Book.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def book_params + params.require(:book).permit(:title, :author, :description, :image, :category) + end + + def user_edit + if (user_signed_in? && (current_user.id == @book.user_id)) + @can_edit = true + else + @can_edit = false + end + end + + +end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..82ce038 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,16 @@ +class CommentsController < ApplicationController + def create + @book = Book.find(params[:book_id]) + @comment = @book.comments.create(comment_params) + redirect_to books_id_path(@book) + end + + def index + end + +private +def comment_params +params.require(:comment).permit(:comment, :commenter) +end + +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 0000000..cc0eefc --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,15 @@ +class HomeController < ApplicationController + def index + @books = Book.all + my_book + end + + def my_book + if (user_signed_in?) + @has_books = true + else + @has_books = false + end + end + +end diff --git a/app/helpers/books_helper.rb b/app/helpers/books_helper.rb new file mode 100644 index 0000000..4b9311e --- /dev/null +++ b/app/helpers/books_helper.rb @@ -0,0 +1,2 @@ +module BooksHelper +end diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb new file mode 100644 index 0000000..0ec9ca5 --- /dev/null +++ b/app/helpers/comments_helper.rb @@ -0,0 +1,2 @@ +module CommentsHelper +end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb new file mode 100644 index 0000000..23de56a --- /dev/null +++ b/app/helpers/home_helper.rb @@ -0,0 +1,2 @@ +module HomeHelper +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 10a4cba..c0fe7da 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,3 +1,5 @@ class ApplicationRecord < ActiveRecord::Base self.abstract_class = true + require 'carrierwave/orm/activerecord' + # encoded = ActiveRecord::Base.connection.escape_bytea(@image) end diff --git a/app/models/book.rb b/app/models/book.rb new file mode 100644 index 0000000..1fa9c6a --- /dev/null +++ b/app/models/book.rb @@ -0,0 +1,5 @@ +class Book < ApplicationRecord + belongs_to :user + has_many :comments, dependent: :destroy + mount_uploader :image, ImageUploader +end diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 0000000..7b1cda1 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,3 @@ +class Comment < ApplicationRecord + belongs_to :book +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..a99a1f3 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,10 @@ +class User < ApplicationRecord + has_many :books, dependent: :destroy + # Include default devise modules. Others available are: + # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :validatable + + validates :email, presence: true, format: /\w+@\w+\.{1}[a-zA-Z]{2,}/ + +end diff --git a/app/uploaders/image_uploader.rb b/app/uploaders/image_uploader.rb new file mode 100644 index 0000000..2c23415 --- /dev/null +++ b/app/uploaders/image_uploader.rb @@ -0,0 +1,53 @@ +# encoding: utf-8 + +class ImageUploader < CarrierWave::Uploader::Base + + # Include RMagick or MiniMagick support: + # include CarrierWave::RMagick +# include CarrierWave::MiniMagick + + # Choose what kind of storage to use for this uploader: + storage :file + # storage :fog + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + # def default_url + # # For Rails 3.1+ asset pipeline compatibility: + # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) + + # "/images/fallback/" + [version_name, "default.png"].compact.join('_') + # end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + # version :thumb do + # process :resize_to_fit => [50, 50] + # end + + # Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + + + def extension_white_list + %w(jpg jpeg gif png) + end + + # Override the filename of the uploaded files: + # Avoid using model.id or version_name here, see uploader/store.rb for details. + # def filename + # "something.jpg" if original_filename + # end + +end diff --git a/app/views/books/_book.json.jbuilder b/app/views/books/_book.json.jbuilder new file mode 100644 index 0000000..b12aab1 --- /dev/null +++ b/app/views/books/_book.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! book, :id, :title, :author, :description, :image, :category, :created_at, :updated_at +json.url book_url(book, format: :json) diff --git a/app/views/books/_form.html.erb b/app/views/books/_form.html.erb new file mode 100644 index 0000000..444e99c --- /dev/null +++ b/app/views/books/_form.html.erb @@ -0,0 +1,43 @@ +<%= form_with(model: book, local: true) do |form| %> + <% if book.errors.any? %> +
+

<%= pluralize(book.errors.count, "error") %> prohibited this book from being saved:

+ + +
+ <% end %> + +
+ <%= form.label :title %> + <%= form.text_field :title %> +
+ +
+ <%= form.label :author %> + <%= form.text_field :author %> +
+ +
+ <%= form.label :description %> + <%= form.text_field :description %> +
+ +
+ <%= form.label :image %> + <%= form.file_field :image %> +
+ +
+ <%= form.label :category %> + <%= form.select :category, ['option1', 'option2', 'option3']%> +
+ +
+ <%= form.submit %> +
+ +<% end %> diff --git a/app/views/books/edit.html.erb b/app/views/books/edit.html.erb new file mode 100644 index 0000000..08bd886 --- /dev/null +++ b/app/views/books/edit.html.erb @@ -0,0 +1,9 @@ +<% if @can_edit %> +

Editing Book

+<%= render 'form', book: @book %> + +<%= link_to 'Show', @book %> | +<%= link_to 'Back', books_path %> +<% else %> +

forbiden

+<% end %> \ No newline at end of file diff --git a/app/views/books/index.html.erb b/app/views/books/index.html.erb new file mode 100644 index 0000000..4cf17fa --- /dev/null +++ b/app/views/books/index.html.erb @@ -0,0 +1,33 @@ +

<%= notice %>

+

Books

+ + + + + + + + + + + + + + <% @books.each do |book| %> + + + + + + + + + + + <% end %> + +
TitleAuthorDescriptionImageCategory
<%= book.title %><%= book.author %><%= book.description %><%= book.image %><%= book.category %><%= link_to 'Show', book %><%= link_to 'Edit', edit_book_path(book) %><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Book', new_book_path %> diff --git a/app/views/books/index.json.jbuilder b/app/views/books/index.json.jbuilder new file mode 100644 index 0000000..7ee9cfe --- /dev/null +++ b/app/views/books/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @books, partial: 'books/book', as: :book diff --git a/app/views/books/new.html.erb b/app/views/books/new.html.erb new file mode 100644 index 0000000..9607d41 --- /dev/null +++ b/app/views/books/new.html.erb @@ -0,0 +1,5 @@ +

New Book

+ +<%= render 'form', book: @book %> + +<%= link_to 'Back', books_path %> diff --git a/app/views/books/show.html.erb b/app/views/books/show.html.erb new file mode 100644 index 0000000..787e4de --- /dev/null +++ b/app/views/books/show.html.erb @@ -0,0 +1,46 @@ +

<%= notice %>

+ +

+ Title: + <%= @book.title %> +

+ +

+ Author: + <%= @book.author %> +

+ +

+ Description: + <%= @book.description %> +

+ + + +

+Image: +<% if @book.image.url != nil %> + <%= image_tag @book.image.url %> +<%else%> + <%= image_tag 'https://png.pngtree.com/element_pic/17/07/27/bd157c7c747dc708790aa64b43c3da35.jpg' %> +<%end%> +

+ +

+ Category: + <%= @book.category %> +

+ +

Comments

+<%= render @book.comments %> + +

Add a comment:

+<%= render 'comments/form' %> + +<%= link_to 'Back', books_path %> + +<% if @can_edit %> + +<%= link_to 'Edit', edit_book_path(@book) %> + +<% end %> \ No newline at end of file diff --git a/app/views/books/show.json.jbuilder b/app/views/books/show.json.jbuilder new file mode 100644 index 0000000..c1e5174 --- /dev/null +++ b/app/views/books/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "books/book", book: @book diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb new file mode 100644 index 0000000..32474a6 --- /dev/null +++ b/app/views/comments/_comment.html.erb @@ -0,0 +1,10 @@ + +

+Commenter: +<%= comment.commenter %> +

+ +

+Comment: +<%= comment.comment %> +

diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb new file mode 100644 index 0000000..6f94a69 --- /dev/null +++ b/app/views/comments/_form.html.erb @@ -0,0 +1,16 @@ + +<%= form_with(model: [ @book, @book.comments.build ], local: true) do |form| %> +

+ <%= form.label :commenter %>
+ <%= form.text_field :commenter %> +

+ +

+ <%= form.label :comment %>
+ <%= form.text_area :comment %> +

+ +

+ <%= form.submit %> +

+ <% end %> \ No newline at end of file diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb new file mode 100644 index 0000000..5f4cfd8 --- /dev/null +++ b/app/views/home/index.html.erb @@ -0,0 +1,33 @@ +<%= link_to 'New Book', new_book_path %> + + + +<% if @has_books %> +<%= link_to 'My books', books_path %> +<%end%> +
+ +
+
+ +<% @books.each do |book| %> +
+ +
+<% if book.image.url != nil %> + + <%= image_tag book.image.url , class: "card-img-top", style: "width: 14rem; height: 200px;" %> + <%else%> + <%= image_tag 'https://png.pngtree.com/element_pic/17/07/27/bd157c7c747dc708790aa64b43c3da35.jpg' , class: "card-img-top", style: "width: 14rem; height: 200px;"%> + <%end%> + +
+
<%= link_to book.title, book %>
+ +

<%= link_to book.description, book %>

+
+ +
+
+<% end %> +
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index aac73db..9719888 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,11 +5,40 @@ <%= csrf_meta_tags %> <%= csp_meta_tag %> - <%= stylesheet_link_tag 'application', media: 'all' %> + <%= stylesheet_link_tag 'application', media: 'all' %> <%= javascript_include_tag 'application' %> - <%= yield %> + + <%= yield %> diff --git a/config/application.rb b/config/application.rb index ef84894..7205b26 100644 --- a/config/application.rb +++ b/config/application.rb @@ -2,6 +2,8 @@ require 'rails/all' + + # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) diff --git a/config/environments/development.rb b/config/environments/development.rb index 1311e3e..9ee7954 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -58,4 +58,5 @@ # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker + config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } end diff --git a/config/initializers/carrier_wave.rb b/config/initializers/carrier_wave.rb new file mode 100644 index 0000000..3f4e753 --- /dev/null +++ b/config/initializers/carrier_wave.rb @@ -0,0 +1 @@ +# require 'carrierwave/orm/activerecord' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb new file mode 100644 index 0000000..bb29b8e --- /dev/null +++ b/config/initializers/devise.rb @@ -0,0 +1,299 @@ +# frozen_string_literal: true + +# Use this hook to configure devise mailer, warden hooks and so forth. +# Many of these configuration options can be set straight in your model. +Devise.setup do |config| + # The secret key used by Devise. Devise uses this key to generate + # random tokens. Changing this key will render invalid all existing + # confirmation, reset password and unlock tokens in the database. + # Devise will use the `secret_key_base` as its `secret_key` + # by default. You can change it below and use your own secret key. + # config.secret_key = 'eda9dcb92e386e00f1faa5e42f9bb08cb75c425fbdef94b0d5e3e4015242fd3f53bb327fcbee606e426bb255610046833d154db619a540ec5afdc095905e3587' + + # ==> Controller configuration + # Configure the parent class to the devise controllers. + # config.parent_controller = 'DeviseController' + + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class + # with default "from" parameter. + config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' + + # Configure the class responsible to send e-mails. + # config.mailer = 'Devise::Mailer' + + # Configure the parent class responsible to send e-mails. + # config.parent_mailer = 'ActionMailer::Base' + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [:email] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [:email] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [:email] + + # Tell if authentication through request.params is enabled. True by default. + # It can be set to an array that will enable params authentication only for the + # given strategies, for example, `config.params_authenticatable = [:database]` will + # enable it only for database (email + password) authentication. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Auth is enabled. False by default. + # It can be set to an array that will enable http authentication only for the + # given strategies, for example, `config.http_authenticatable = [:database]` will + # enable it only for database authentication. The supported strategies are: + # :database = Support basic authentication with authentication key + password + # config.http_authenticatable = false + + # If 401 status code should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. 'Application' by default. + # config.http_authentication_realm = 'Application' + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # By default Devise will store the user in session. You can skip storage for + # particular strategies by setting this option. + # Notice that if you are skipping storage for all authentication paths, you + # may want to disable generating routes to Devise's sessions controller by + # passing skip: :sessions to `devise_for` in your config/routes.rb + config.skip_session_storage = [:http_auth] + + # By default, Devise cleans up the CSRF token on authentication to + # avoid CSRF token fixation attacks. This means that, when using AJAX + # requests for sign in and sign up, you need to get a new CSRF token + # from the server. You can disable this option at your own risk. + # config.clean_up_csrf_token_on_authentication = true + + # When false, Devise will not attempt to reload routes on eager load. + # This can reduce the time taken to boot the app but if your application + # requires the Devise mappings to be loaded during boot time the application + # won't boot properly. + # config.reload_routes = true + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 11. If + # using other algorithms, it sets how many times you want the password to be hashed. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. Note that, for bcrypt (the default + # algorithm), the cost increases exponentially with the number of stretches (e.g. + # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation). + config.stretches = Rails.env.test? ? 1 : 11 + + # Set up a pepper to generate the hashed password. + # config.pepper = '4f802580c9b56fd75c4200c4d9d8e5952a1b37a0d600e0439d9c8652a3cd4da1c0402ebb681486fd581d0951fbe241cba6f9ebae98c67bbdaa0138ab00530ba3' + + # Send a notification to the original email when the user's email is changed. + # config.send_email_changed_notification = false + + # Send a notification email when the user's password is changed. + # config.send_password_change_notification = false + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming their account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming their account, + # access will be blocked just in the third day. + # You can also set it to nil, which will allow the user to access the website + # without confirming their account. + # Default is 0.days, meaning the user cannot access the website without + # confirming their account. + # config.allow_unconfirmed_access_for = 2.days + + # A period that the user is allowed to confirm their account before their + # token becomes invalid. For example, if set to 3.days, the user can confirm + # their account within 3 days after the mail was sent, but on the fourth day + # their account can't be confirmed with the token any more. + # Default is nil, meaning there is no restriction on how long a user can take + # before confirming their account. + # config.confirm_within = 3.days + + # If true, requires any email changes to be confirmed (exactly the same way as + # initial account confirmation) to be applied. Requires additional unconfirmed_email + # db field (see migrations). Until confirmed, new email is stored in + # unconfirmed_email column, and copied to email column on successful confirmation. + config.reconfirmable = true + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [:email] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # Invalidates all the remember me tokens when the user signs out. + config.expire_all_remember_me_on_sign_out = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # Options to be passed to the created cookie. For instance, you can set + # secure: true in order to force SSL only cookies. + # config.rememberable_options = {} + + # ==> Configuration for :validatable + # Range for password length. + config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + config.email_regexp = /\A[^@\s]+@[^@\s]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [:email] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # Warn on the last attempt before the account is locked. + # config.last_attempt_warning = true + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [:email] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 6.hours + + # When set to false, does not sign a user in automatically after their password is + # reset. Defaults to true, so a user is signed in automatically after a reset. + # config.sign_in_after_reset_password = true + + # ==> Configuration for :encryptable + # Allow you to use another hashing or encryption algorithm besides bcrypt (default). + # You can use :sha1, :sha512 or algorithms from others authentication tools as + # :clearance_sha1, :authlogic_sha512 (then you should set stretches above to 20 + # for default behavior) and :restful_authentication_sha1 (then you should set + # stretches to 10, and copy REST_AUTH_SITE_KEY to pepper). + # + # Require the `devise-encryptable` gem when using anything other than bcrypt + # config.encryptor = :sha512 + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Set this configuration to false if you want /users/sign_out to sign out + # only the current scope. By default, Devise signs out all scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The "*/*" below is required to match Internet Explorer requests. + # config.navigational_formats = ['*/*', :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.intercept_401 = false + # manager.default_strategies(scope: :user).unshift :some_external_strategy + # end + + # ==> Mountable engine configurations + # When using Devise inside an engine, let's call it `MyEngine`, and this engine + # is mountable, there are some extra configurations to be taken into account. + # The following options are available, assuming the engine is mounted as: + # + # mount MyEngine, at: '/my_engine' + # + # The router that invoked `devise_for`, in the example above, would be: + # config.router_name = :my_engine + # + # When using OmniAuth, Devise cannot automatically set OmniAuth path, + # so you need to do it manually. For the users scope, it would be: + # config.omniauth_path_prefix = '/my_engine/users/auth' + + # ==> Turbolinks configuration + # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly: + # + # ActiveSupport.on_load(:devise_failure_app) do + # include Turbolinks::Controller + # end + + # ==> Configuration for :registerable + + # When set to false, does not sign a user in automatically after their password is + # changed. Defaults to true, so a user is signed in automatically after changing a password. + # config.sign_in_after_change_password = true +end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 0000000..55617bd --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,65 @@ +# Additional translations at https://github.com/plataformatec/devise/wiki/I18n + +en: + devise: + confirmations: + confirmed: "Your email address has been successfully confirmed." + send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes." + failure: + already_authenticated: "You are already signed in." + inactive: "Your account is not activated yet." + invalid: "Invalid %{authentication_keys} or password." + locked: "Your account is locked." + last_attempt: "You have one more attempt before your account is locked." + not_found_in_database: "Invalid %{authentication_keys} or password." + timeout: "Your session expired. Please sign in again to continue." + unauthenticated: "You need to sign in or sign up before continuing." + unconfirmed: "You have to confirm your email address before continuing." + mailer: + confirmation_instructions: + subject: "Confirmation instructions" + reset_password_instructions: + subject: "Reset password instructions" + unlock_instructions: + subject: "Unlock instructions" + email_changed: + subject: "Email Changed" + password_change: + subject: "Password Changed" + omniauth_callbacks: + failure: "Could not authenticate you from %{kind} because \"%{reason}\"." + success: "Successfully authenticated from %{kind} account." + passwords: + no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." + updated: "Your password has been changed successfully. You are now signed in." + updated_not_active: "Your password has been changed successfully." + registrations: + destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon." + signed_up: "Welcome! You have signed up successfully." + signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." + signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." + signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." + updated: "Your account has been updated successfully." + updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" + sessions: + signed_in: "Signed in successfully." + signed_out: "Signed out successfully." + already_signed_out: "Signed out successfully." + unlocks: + send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes." + send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes." + unlocked: "Your account has been unlocked successfully. Please sign in to continue." + errors: + messages: + already_confirmed: "was already confirmed, please try signing in" + confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" + expired: "has expired, please request a new one" + not_found: "not found" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" diff --git a/config/locales/en.yml b/config/locales/en.yml index decc5a8..a43e1b4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -31,3 +31,5 @@ en: hello: "Hello world" + + diff --git a/config/routes.rb b/config/routes.rb index 787824f..d393e3b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,13 @@ Rails.application.routes.draw do + get 'comments/create' + get 'comments/index' + devise_for :users + get 'home/index' => 'home#index', as:'home' + root 'home#index' + resources :books do + resources :comments + end + + get 'books/:id' => 'books#show', as:'books_id' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html -end +end \ No newline at end of file diff --git a/db/migrate/20190307143154_create_books.rb b/db/migrate/20190307143154_create_books.rb new file mode 100644 index 0000000..8c88bc4 --- /dev/null +++ b/db/migrate/20190307143154_create_books.rb @@ -0,0 +1,13 @@ +class CreateBooks < ActiveRecord::Migration[5.2] + def change + create_table :books do |t| + t.string :title + t.string :author + t.string :description + t.string :image + t.string :category + + t.timestamps + end + end +end diff --git a/db/migrate/20190307144301_devise_create_users.rb b/db/migrate/20190307144301_devise_create_users.rb new file mode 100644 index 0000000..e4fe133 --- /dev/null +++ b/db/migrate/20190307144301_devise_create_users.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class DeviseCreateUsers < ActiveRecord::Migration[5.2] + def change + create_table :users do |t| + ## Database authenticatable + t.string :email, null: false, default: "" + t.string :encrypted_password, null: false, default: "" + + ## Recoverable + t.string :reset_password_token + t.datetime :reset_password_sent_at + + ## Rememberable + t.datetime :remember_created_at + + ## Trackable + # t.integer :sign_in_count, default: 0, null: false + # t.datetime :current_sign_in_at + # t.datetime :last_sign_in_at + # t.inet :current_sign_in_ip + # t.inet :last_sign_in_ip + + ## Confirmable + # t.string :confirmation_token + # t.datetime :confirmed_at + # t.datetime :confirmation_sent_at + # t.string :unconfirmed_email # Only if using reconfirmable + + ## Lockable + # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts + # t.string :unlock_token # Only if unlock strategy is :email or :both + # t.datetime :locked_at + + + t.timestamps null: false + end + + add_index :users, :email, unique: true + add_index :users, :reset_password_token, unique: true + # add_index :users, :confirmation_token, unique: true + # add_index :users, :unlock_token, unique: true + end +end diff --git a/db/migrate/20190310114844_add_user_to_books.rb b/db/migrate/20190310114844_add_user_to_books.rb new file mode 100644 index 0000000..3dcf7e6 --- /dev/null +++ b/db/migrate/20190310114844_add_user_to_books.rb @@ -0,0 +1,5 @@ +class AddUserToBooks < ActiveRecord::Migration[5.2] + def change + add_reference :books, :user, foreign_key: true + end +end diff --git a/db/migrate/20190311120153_change_image_to_be_binary_in_books.rb b/db/migrate/20190311120153_change_image_to_be_binary_in_books.rb new file mode 100644 index 0000000..a352ca2 --- /dev/null +++ b/db/migrate/20190311120153_change_image_to_be_binary_in_books.rb @@ -0,0 +1,12 @@ +class ChangeImageToBeBinaryInBooks < ActiveRecord::Migration[5.2] + def change + change_column :books, :image, 'bytea USING CAST(image AS bytea)' + end + def up + add_attachment :books, :image + end + + def down + remove_attachment :books, :image + end +end diff --git a/db/migrate/20190312081807_create_comments.rb b/db/migrate/20190312081807_create_comments.rb new file mode 100644 index 0000000..90275d6 --- /dev/null +++ b/db/migrate/20190312081807_create_comments.rb @@ -0,0 +1,11 @@ +class CreateComments < ActiveRecord::Migration[5.2] + def change + create_table :comments do |t| + t.string :comment + t.string :commenter + t.references :book, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..bdfb358 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,53 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2019_03_12_081807) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "books", force: :cascade do |t| + t.string "title" + t.string "author" + t.string "description" + t.binary "image" + t.string "category" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "user_id" + t.index ["user_id"], name: "index_books_on_user_id" + end + + create_table "comments", force: :cascade do |t| + t.string "comment" + t.string "commenter" + t.bigint "book_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["book_id"], name: "index_comments_on_book_id" + end + + create_table "users", force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["email"], name: "index_users_on_email", unique: true + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true + end + + add_foreign_key "books", "users" + add_foreign_key "comments", "books" +end diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2a..27bc871 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,5 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +# books=[{}] diff --git a/public/uploads/book/image/11/depositphotos_87331584-stock-photo-programming-works-concept.jpg b/public/uploads/book/image/11/depositphotos_87331584-stock-photo-programming-works-concept.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eaafec1569aaff4d812f19e2902558700a71ab76 GIT binary patch literal 89346 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�-}MU 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 }w53lSs4J6ANqTZG!emO1b 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 hDL80W13bP!#8)z7qKWE$t