diff --git a/Gemfile b/Gemfile index fba3b4e..adbf0ab 100644 --- a/Gemfile +++ b/Gemfile @@ -38,3 +38,15 @@ gem 'spring', group: :development # Use debugger # gem 'debugger', group: [:development, :test] +gem 'devise' + +gem 'bootstrap-sass' + +gem 'simple_form' + +#carrierwave use imagemagic +gem 'rmagick' +gem 'carrierwave' + +#navi bar +gem 'rails_bootstrap_navbar' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 53538d9..b7c681f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -28,7 +28,17 @@ GEM thread_safe (~> 0.1) tzinfo (~> 1.1) arel (5.0.1.20140414130214) + bcrypt (3.1.7) + bootstrap-navbar (2.1.4) + gem_config (~> 0.3) + bootstrap-sass (3.2.0.0) + sass (~> 3.2) builder (3.2.2) + carrierwave (0.10.0) + activemodel (>= 3.2.0) + activesupport (>= 3.2.0) + json (>= 1.7) + mime-types (>= 1.16) coffee-rails (4.0.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) @@ -36,8 +46,15 @@ GEM coffee-script-source execjs coffee-script-source (1.7.0) + devise (3.2.4) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 3.2.6, < 5) + thread_safe (~> 0.1) + warden (~> 1.2.3) erubis (2.7.0) execjs (2.2.0) + gem_config (0.3.1) hike (1.2.3) i18n (0.6.9) jbuilder (2.0.8) @@ -53,6 +70,7 @@ GEM mime-types (1.25.1) minitest (5.3.4) multi_json (1.10.1) + orm_adapter (0.5.0) polyglot (0.3.5) rack (1.5.2) rack-test (0.6.2) @@ -67,6 +85,9 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 4.1.0) sprockets-rails (~> 2.0) + rails_bootstrap_navbar (2.0.1) + bootstrap-navbar (~> 2.0) + rails (>= 3.0.0) railties (4.1.0) actionpack (= 4.1.0) activesupport (= 4.1.0) @@ -75,6 +96,7 @@ GEM rake (10.3.2) rdoc (4.1.1) json (~> 1.4) + rmagick (2.13.2) sass (3.2.19) sass-rails (4.0.3) railties (>= 4.0.0, < 5.0) @@ -84,6 +106,9 @@ GEM sdoc (0.4.0) json (~> 1.8) rdoc (~> 4.0, < 5.0) + simple_form (3.0.2) + actionpack (~> 4.0) + activemodel (~> 4.0) spring (1.1.3) sprockets (2.11.0) hike (~> 1.2) @@ -108,17 +133,25 @@ GEM uglifier (2.5.0) execjs (>= 0.3.0) json (>= 1.8.0) + warden (1.2.3) + rack (>= 1.0) PLATFORMS ruby DEPENDENCIES + bootstrap-sass + carrierwave coffee-rails (~> 4.0.0) + devise jbuilder (~> 2.0) jquery-rails rails (= 4.1.0) + rails_bootstrap_navbar + rmagick sass-rails (~> 4.0.3) sdoc (~> 0.4.0) + simple_form spring sqlite3 turbolinks diff --git a/app/assets/javascripts/admin/products.js.coffee b/app/assets/javascripts/admin/products.js.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/admin/products.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/admin/products.css.scss b/app/assets/stylesheets/admin/products.css.scss new file mode 100644 index 0000000..da8969d --- /dev/null +++ b/app/assets/stylesheets/admin/products.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the admin::products 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/application.css b/app/assets/stylesheets/application.css index a443db3..bcdb41c 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -12,4 +12,5 @@ * *= require_tree . *= require_self + *= require bootstrap */ diff --git a/app/controllers/admin/products_controller.rb b/app/controllers/admin/products_controller.rb new file mode 100644 index 0000000..3147256 --- /dev/null +++ b/app/controllers/admin/products_controller.rb @@ -0,0 +1,60 @@ +class Admin::ProductsController < ApplicationController + + before_action :authenticate_user! + before_action :admin_required + + def new + @product = Product.new + @photo = @product.photos.new + end + + def create + @product = Product.new(product_params) + + if @product.save + redirect_to admin_products_path + else + render :new + end + end + + def index + @products = Product.all + @photos = Photo.all + end + + def show + @product = Product.find(params[:id]) + end + + def edit + @product = Product.find(params[:id]) + end + + def update + @product = Product.find(params[:id]) + + if @product.update(product_params) + redirect_to admin_products_path + else + render :edit + end + end + + def destroy + @product = Product.find(params[:id]) + + @product.destroy + + flash[:success] = "Delete Successfully!." + + redirect_to admin_products_path + end + + private + + def product_params + params.require(:product).permit(:title, :description,:quantity, :price, :photos_attributes => [:image]) + end + +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d83690e..5d561a9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,9 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + + def admin_required + current_user.admin? + end + end diff --git a/app/helpers/admin/products_helper.rb b/app/helpers/admin/products_helper.rb new file mode 100644 index 0000000..977a242 --- /dev/null +++ b/app/helpers/admin/products_helper.rb @@ -0,0 +1,2 @@ +module Admin::ProductsHelper +end diff --git a/app/models/photo.rb b/app/models/photo.rb new file mode 100644 index 0000000..c326d18 --- /dev/null +++ b/app/models/photo.rb @@ -0,0 +1,4 @@ +class Photo < ActiveRecord::Base + belongs_to :product + mount_uploader :image, ImageUploader +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000..fad2fef --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,4 @@ +class Product < ActiveRecord::Base + has_many :photos + accepts_nested_attributes_for :photos +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..1d47075 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,10 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable + + def admin? + is_admin + end +end diff --git a/app/uploaders/image_uploader.rb b/app/uploaders/image_uploader.rb new file mode 100644 index 0000000..3a4443f --- /dev/null +++ b/app/uploaders/image_uploader.rb @@ -0,0 +1,51 @@ +# 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_limit => [200, 200] + 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/admin/products/edit.html.erb b/app/views/admin/products/edit.html.erb new file mode 100644 index 0000000..7630892 --- /dev/null +++ b/app/views/admin/products/edit.html.erb @@ -0,0 +1,18 @@ +