From 7fb49f711b1f43247e10bac3cb72358072c57437 Mon Sep 17 00:00:00 2001 From: Ali <30610753+aamining@users.noreply.github.com> Date: Thu, 19 Oct 2017 21:37:25 +1100 Subject: [PATCH] Home page controller and Product table setup and run --- Gemfile.lock | 9 ++- app/assets/javascripts/products.coffee | 3 + app/assets/stylesheets/products.scss | 3 + app/controllers/products_controller.rb | 75 ++++++++++++++++++ app/helpers/products_helper.rb | 2 + app/models/product.rb | 4 + app/models/user.rb | 1 + app/uploaders/image_uploader.rb | 49 ++++++++++++ app/views/products/_form.html.erb | 14 ++++ app/views/products/_product.json.jbuilder | 2 + app/views/products/edit.html.erb | 6 ++ app/views/products/index.html.erb | 33 ++++++++ app/views/products/index.json.jbuilder | 1 + app/views/products/new.html.erb | 5 ++ app/views/products/show.html.erb | 21 +++++ app/views/products/show.json.jbuilder | 1 + config/routes.rb | 1 + db/migrate/20171019084148_create_products.rb | 12 +++ db/schema.rb | 12 ++- public/uploads/download.jpeg | Bin 0 -> 8803 bytes .../1508403197-39107-0001-3403/download.jpeg | Bin 0 -> 8803 bytes .../1508403378-39663-0001-2184/download.jpeg | Bin 0 -> 8803 bytes test/controllers/products_controller_test.rb | 48 +++++++++++ test/fixtures/products.yml | 13 +++ test/models/product_test.rb | 7 ++ test/system/products_test.rb | 9 +++ 26 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/products.coffee create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/controllers/products_controller.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/models/product.rb create mode 100644 app/uploaders/image_uploader.rb create mode 100644 app/views/products/_form.html.erb create mode 100644 app/views/products/_product.json.jbuilder create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/index.json.jbuilder create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb create mode 100644 app/views/products/show.json.jbuilder create mode 100644 db/migrate/20171019084148_create_products.rb create mode 100644 public/uploads/download.jpeg create mode 100644 public/uploads/tmp/1508403197-39107-0001-3403/download.jpeg create mode 100644 public/uploads/tmp/1508403378-39663-0001-2184/download.jpeg create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/fixtures/products.yml create mode 100644 test/models/product_test.rb create mode 100644 test/system/products_test.rb diff --git a/Gemfile.lock b/Gemfile.lock index 6c8f1fa..8438875 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -43,6 +43,7 @@ GEM arel (8.0.0) autoprefixer-rails (7.1.5) execjs + bcrypt (3.1.11) bcrypt (3.1.11-x64-mingw32) bindex (0.5.0) bootstrap-sass (3.3.7) @@ -82,6 +83,7 @@ GEM execjs (2.7.0) faraday (0.13.1) multipart-post (>= 1.2, < 3) + ffi (1.9.18) ffi (1.9.18-x64-mingw32) geocoder (1.4.4) globalid (0.4.0) @@ -106,9 +108,12 @@ GEM multi_json (1.12.2) multipart-post (2.0.0) nio4r (2.1.0) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) nokogiri (1.8.1-x64-mingw32) mini_portile2 (~> 2.3.0) orm_adapter (0.5.0) + pg (0.21.0) pg (0.21.0-x64-mingw32) public_suffix (3.0.0) puma (3.10.0) @@ -170,6 +175,7 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) + sqlite3 (1.3.13) sqlite3 (1.3.13-x64-mingw32) stripe (3.6.0) faraday (~> 0.10) @@ -199,6 +205,7 @@ GEM nokogiri (~> 1.3) PLATFORMS + ruby x64-mingw32 DEPENDENCIES @@ -224,4 +231,4 @@ DEPENDENCIES web-console (>= 3.3.0) BUNDLED WITH - 1.16.0.pre.2 + 1.16.0.pre.3 diff --git a/app/assets/javascripts/products.coffee b/app/assets/javascripts/products.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/products.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/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000..bff386e --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the 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/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000..c7811c1 --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,75 @@ +class ProductsController < ApplicationController + before_action :set_product, only: [:show, :edit, :update, :destroy] + + # GET /products + # GET /products.json + def index + @products = Product.all + + end + + # GET /products/1 + # GET /products/1.json + def show + end + + # GET /products/new + def new + @product = Product.new + end + + # GET /products/1/edit + def edit + end + + # POST /products + # POST /products.json + def create + @product = Product.new(product_params) + @product.user_id = current_user.id + respond_to do |format| + if @product.save + format.html { redirect_to @product, notice: 'Product was successfully created.' } + format.json { render :show, status: :created, location: @product } + else + format.html { render :new } + format.json { render json: @product.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /products/1 + # PATCH/PUT /products/1.json + def update + respond_to do |format| + if @product.update(product_params) + format.html { redirect_to @product, notice: 'Product was successfully updated.' } + format.json { render :show, status: :ok, location: @product } + else + format.html { render :edit } + format.json { render json: @product.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /products/1 + # DELETE /products/1.json + def destroy + @product.destroy + respond_to do |format| + format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_product + @product = Product.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def product_params + params.require(:product).permit(:description, :price, :image, :user_id) + end +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000..ab5c42b --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000..c04e8c6 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,4 @@ +class Product < ApplicationRecord + belongs_to :user + mount_uploader :image +end diff --git a/app/models/user.rb b/app/models/user.rb index b2091f9..989875d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,4 +3,5 @@ class User < ApplicationRecord # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable + has_many :products end diff --git a/app/uploaders/image_uploader.rb b/app/uploaders/image_uploader.rb new file mode 100644 index 0000000..836a047 --- /dev/null +++ b/app/uploaders/image_uploader.rb @@ -0,0 +1,49 @@ +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(*args) + # # 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_whitelist + # %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/products/_form.html.erb b/app/views/products/_form.html.erb new file mode 100644 index 0000000..aef491b --- /dev/null +++ b/app/views/products/_form.html.erb @@ -0,0 +1,14 @@ +<%= simple_form_for(@product) do |f| %> + <%= f.error_notification %> + +
+ <%= f.input :description %> + <%= f.input :price %> + <%= f.input :image, as: :file %> + +
+ +
+ <%= f.button :submit %> +
+<% end %> diff --git a/app/views/products/_product.json.jbuilder b/app/views/products/_product.json.jbuilder new file mode 100644 index 0000000..4eb94cd --- /dev/null +++ b/app/views/products/_product.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! product, :id, :description, :price, :image, :user_id, :created_at, :updated_at +json.url product_url(product, format: :json) diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000..fc16e13 --- /dev/null +++ b/app/views/products/edit.html.erb @@ -0,0 +1,6 @@ +

Editing Product

+ +<%= render 'form', product: @product %> + +<%= link_to 'Show', @product %> | +<%= link_to 'Back', products_path %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000..2aad41e --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1,33 @@ +

<%= notice %>

+ +

Products

+ + + + + + + + + + + + + + <% @products.each do |product| %> + + + + + + + + + + <% end %> + +
DescriptionPriceImageUser
<%= product.description %><%= product.price %><%= image_tag(product.image_url) %><%= link_to 'Show', product %><%= link_to 'Edit', edit_product_path(product) %><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Product', new_product_path %> diff --git a/app/views/products/index.json.jbuilder b/app/views/products/index.json.jbuilder new file mode 100644 index 0000000..4eec33e --- /dev/null +++ b/app/views/products/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @products, partial: 'products/product', as: :product diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000..a06963d --- /dev/null +++ b/app/views/products/new.html.erb @@ -0,0 +1,5 @@ +

New Product

+ +<%= render 'form', product: @product %> + +<%= link_to 'Back', products_path %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000..9b2c253 --- /dev/null +++ b/app/views/products/show.html.erb @@ -0,0 +1,21 @@ +

<%= notice %>

+ +

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

+ +

+ Price: + <%= @product.price %> +

+ + + +<%= image_tag(@product.image_url) %> + +<%= link_to 'Edit', edit_product_path(@product) %> | +<%= link_to 'Back', products_path %> diff --git a/app/views/products/show.json.jbuilder b/app/views/products/show.json.jbuilder new file mode 100644 index 0000000..03b16ec --- /dev/null +++ b/app/views/products/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "products/product", product: @product diff --git a/config/routes.rb b/config/routes.rb index af5052c..2ab21cb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + resources :products devise_for :users resources :users diff --git a/db/migrate/20171019084148_create_products.rb b/db/migrate/20171019084148_create_products.rb new file mode 100644 index 0000000..b9c1579 --- /dev/null +++ b/db/migrate/20171019084148_create_products.rb @@ -0,0 +1,12 @@ +class CreateProducts < ActiveRecord::Migration[5.1] + def change + create_table :products do |t| + t.text :description + t.string :price + t.text :image + t.references :user, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 58e692e..dcedca5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,17 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171019064222) do +ActiveRecord::Schema.define(version: 20171019084148) do + + create_table "products", force: :cascade do |t| + t.text "description" + t.string "price" + t.text "image" + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["user_id"], name: "index_products_on_user_id" + end create_table "users", force: :cascade do |t| t.string "email", default: "", null: false diff --git a/public/uploads/download.jpeg b/public/uploads/download.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ce49a8dc6ab7ad46daed085ca4029826e7eed2ce GIT binary patch literal 8803 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 D;`&86 literal 0 HcmV?d00001 diff --git a/public/uploads/tmp/1508403197-39107-0001-3403/download.jpeg b/public/uploads/tmp/1508403197-39107-0001-3403/download.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ce49a8dc6ab7ad46daed085ca4029826e7eed2ce GIT binary patch literal 8803 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 D;`&86 literal 0 HcmV?d00001 diff --git a/public/uploads/tmp/1508403378-39663-0001-2184/download.jpeg b/public/uploads/tmp/1508403378-39663-0001-2184/download.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ce49a8dc6ab7ad46daed085ca4029826e7eed2ce GIT binary patch literal 8803 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 D;`&86 literal 0 HcmV?d00001 diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000..16b2e10 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class ProductsControllerTest < ActionDispatch::IntegrationTest + setup do + @product = products(:one) + end + + test "should get index" do + get products_url + assert_response :success + end + + test "should get new" do + get new_product_url + assert_response :success + end + + test "should create product" do + assert_difference('Product.count') do + post products_url, params: { product: { description: @product.description, image: @product.image, price: @product.price, user_id: @product.user_id } } + end + + assert_redirected_to product_url(Product.last) + end + + test "should show product" do + get product_url(@product) + assert_response :success + end + + test "should get edit" do + get edit_product_url(@product) + assert_response :success + end + + test "should update product" do + patch product_url(@product), params: { product: { description: @product.description, image: @product.image, price: @product.price, user_id: @product.user_id } } + assert_redirected_to product_url(@product) + end + + test "should destroy product" do + assert_difference('Product.count', -1) do + delete product_url(@product) + end + + assert_redirected_to products_url + end +end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000..32e49e7 --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + description: MyText + price: MyString + image: MyText + user: one + +two: + description: MyText + price: MyString + image: MyText + user: two diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000..211cdd0 --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ProductTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/system/products_test.rb b/test/system/products_test.rb new file mode 100644 index 0000000..a05fbb6 --- /dev/null +++ b/test/system/products_test.rb @@ -0,0 +1,9 @@ +require "application_system_test_case" + +class ProductsTest < ApplicationSystemTestCase + # test "visiting the index" do + # visit products_url + # + # assert_selector "h1", text: "Product" + # end +end