diff --git a/.gitignore b/.gitignore index 354eb8e0..dba9801e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ !/log/.keep /tmp coverage/ +/public/uploads diff --git a/Gemfile b/Gemfile index d142e2fa..7bf46eb4 100644 --- a/Gemfile +++ b/Gemfile @@ -27,6 +27,10 @@ gem 'sdoc', '~> 0.4.0', group: :doc gem 'bcrypt', '~> 3.1.7' gem 'bootstrap-sass' +# for uploads +gem 'mini_magick' +gem 'carrierwave' + # Use Unicorn as the app server # gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index 057a4eb0..55045193 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -53,6 +53,11 @@ GEM builder (3.2.2) byebug (5.0.0) columnize (= 0.9.0) + carrierwave (0.10.0) + activemodel (>= 3.2.0) + activesupport (>= 3.2.0) + json (>= 1.7) + mime-types (>= 1.16) coderay (1.1.0) coffee-rails (4.1.0) coffee-script (>= 2.2.0) @@ -89,6 +94,7 @@ GEM mime-types (>= 1.16, < 3) method_source (0.8.2) mime-types (2.6.1) + mini_magick (4.2.7) mini_portile (0.6.2) minitest (5.7.0) multi_json (1.11.2) @@ -196,10 +202,12 @@ DEPENDENCIES binding_of_caller bootstrap-sass byebug + carrierwave coffee-rails (~> 4.1.0) factory_girl_rails (~> 4.0) jbuilder (~> 2.0) jquery-rails + mini_magick pg pry-rails rails (= 4.2.3) diff --git a/app/assets/.DS_Store b/app/assets/.DS_Store new file mode 100644 index 00000000..0de5ed1f Binary files /dev/null and b/app/assets/.DS_Store differ diff --git a/app/assets/images/almond_butter.jpg b/app/assets/images/almond_butter.jpg new file mode 100644 index 00000000..bf4d2a93 Binary files /dev/null and b/app/assets/images/almond_butter.jpg differ diff --git a/app/assets/images/almonds.jpg b/app/assets/images/almonds.jpg new file mode 100644 index 00000000..543a7700 Binary files /dev/null and b/app/assets/images/almonds.jpg differ diff --git a/app/assets/images/black_pepper.jpg b/app/assets/images/black_pepper.jpg new file mode 100644 index 00000000..8b296bfe Binary files /dev/null and b/app/assets/images/black_pepper.jpg differ diff --git a/app/assets/images/bok_choy.jpg b/app/assets/images/bok_choy.jpg new file mode 100644 index 00000000..30c24241 Binary files /dev/null and b/app/assets/images/bok_choy.jpg differ diff --git a/app/assets/images/bokchoy_pineapple.jpg b/app/assets/images/bokchoy_pineapple.jpg new file mode 100644 index 00000000..be10af7c Binary files /dev/null and b/app/assets/images/bokchoy_pineapple.jpg differ diff --git a/app/assets/images/chicken.jpg b/app/assets/images/chicken.jpg new file mode 100644 index 00000000..69fcc4c1 Binary files /dev/null and b/app/assets/images/chicken.jpg differ diff --git a/app/assets/images/choc_ice_cream.jpg b/app/assets/images/choc_ice_cream.jpg new file mode 100644 index 00000000..de0a21f8 Binary files /dev/null and b/app/assets/images/choc_ice_cream.jpg differ diff --git a/app/assets/images/cilantro.jpg b/app/assets/images/cilantro.jpg new file mode 100644 index 00000000..f064456c Binary files /dev/null and b/app/assets/images/cilantro.jpg differ diff --git a/app/assets/images/cocoa-powder.jpg b/app/assets/images/cocoa-powder.jpg new file mode 100644 index 00000000..85ac071e Binary files /dev/null and b/app/assets/images/cocoa-powder.jpg differ diff --git a/app/assets/images/coconut_milk.jpg b/app/assets/images/coconut_milk.jpg new file mode 100644 index 00000000..84cd5388 Binary files /dev/null and b/app/assets/images/coconut_milk.jpg differ diff --git a/app/assets/images/coconut_oil.jpg b/app/assets/images/coconut_oil.jpg new file mode 100644 index 00000000..e47d1059 Binary files /dev/null and b/app/assets/images/coconut_oil.jpg differ diff --git a/app/assets/images/default_256.png b/app/assets/images/default_256.png new file mode 100644 index 00000000..9e0e354e Binary files /dev/null and b/app/assets/images/default_256.png differ diff --git a/app/assets/images/fake_reeses.jpg b/app/assets/images/fake_reeses.jpg new file mode 100644 index 00000000..6516ceed Binary files /dev/null and b/app/assets/images/fake_reeses.jpg differ diff --git a/app/assets/images/honey.jg.jpg b/app/assets/images/honey.jg.jpg new file mode 100644 index 00000000..0c394397 Binary files /dev/null and b/app/assets/images/honey.jg.jpg differ diff --git a/app/assets/images/honey.jpg b/app/assets/images/honey.jpg new file mode 100644 index 00000000..0c394397 Binary files /dev/null and b/app/assets/images/honey.jpg differ diff --git a/app/assets/images/maple_syrup.jpg b/app/assets/images/maple_syrup.jpg new file mode 100644 index 00000000..9ba5dba1 Binary files /dev/null and b/app/assets/images/maple_syrup.jpg differ diff --git a/app/assets/images/olive_oil.jpg b/app/assets/images/olive_oil.jpg new file mode 100644 index 00000000..61ead9e1 Binary files /dev/null and b/app/assets/images/olive_oil.jpg differ diff --git a/app/assets/images/pineapple.jpg b/app/assets/images/pineapple.jpg new file mode 100644 index 00000000..172f5054 Binary files /dev/null and b/app/assets/images/pineapple.jpg differ diff --git a/app/assets/images/sea_salt.jpg b/app/assets/images/sea_salt.jpg new file mode 100644 index 00000000..86faa962 Binary files /dev/null and b/app/assets/images/sea_salt.jpg differ diff --git a/app/assets/images/yam.jpg b/app/assets/images/yam.jpg new file mode 100644 index 00000000..4ee014da Binary files /dev/null and b/app/assets/images/yam.jpg differ diff --git a/app/assets/images/yam_chips.jpg b/app/assets/images/yam_chips.jpg new file mode 100644 index 00000000..1a489b2b Binary files /dev/null and b/app/assets/images/yam_chips.jpg differ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e07c5a83..74658567 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -13,4 +13,5 @@ //= require jquery //= require jquery_ujs //= require turbolinks +//= require bootstrap-sprockets //= require_tree . diff --git a/app/assets/javascripts/cookbooks.coffee b/app/assets/javascripts/cookbooks.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/cookbooks.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/javascripts/home.coffee b/app/assets/javascripts/home.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/home.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/javascripts/ingredients.coffee b/app/assets/javascripts/ingredients.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/ingredients.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/javascripts/recipes.coffee b/app/assets/javascripts/recipes.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/recipes.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/javascripts/sessions.coffee b/app/assets/javascripts/sessions.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/sessions.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/javascripts/users.coffee b/app/assets/javascripts/users.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/users.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/application.css b/app/assets/stylesheets/application.scss similarity index 80% rename from app/assets/stylesheets/application.css rename to app/assets/stylesheets/application.scss index f9cd5b34..8569d5ba 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.scss @@ -1,3 +1,4 @@ + /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. @@ -13,3 +14,16 @@ *= require_tree . *= require_self */ + + @import "bootstrap-sprockets"; + @import "bootstrap"; + + $error: #F72B1D; /* red for warining */ + + .container { + margin-top: 30px + } + + .error { + color: $error; +} diff --git a/app/assets/stylesheets/cookbooks.scss b/app/assets/stylesheets/cookbooks.scss new file mode 100644 index 00000000..7ccd3d3f --- /dev/null +++ b/app/assets/stylesheets/cookbooks.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Cookbooks 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 00000000..f0ddc684 --- /dev/null +++ b/app/assets/stylesheets/home.scss @@ -0,0 +1,3 @@ +// 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/ingredients.scss b/app/assets/stylesheets/ingredients.scss new file mode 100644 index 00000000..98f8d500 --- /dev/null +++ b/app/assets/stylesheets/ingredients.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the ingredients 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/recipes.scss b/app/assets/stylesheets/recipes.scss new file mode 100644 index 00000000..1e10ffa5 --- /dev/null +++ b/app/assets/stylesheets/recipes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the recipes 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/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 00000000..7bef9cf8 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sessions 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/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 00000000..1efc835c --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the users 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/application_controller.rb b/app/controllers/application_controller.rb index d83690e1..42af2e26 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,13 @@ 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 + MESSAGES = {not_logged_in: "You must be logged in to view this page!" } + + def require_login + redirect_to login_path, flash: {error: MESSAGES[:not_logged_in]} unless session[:user_id] + end + + # def user_cookbooks + # redirect_to root_path unless session[:user_id] + # end end diff --git a/app/controllers/cookbooks_controller.rb b/app/controllers/cookbooks_controller.rb new file mode 100644 index 00000000..66fa3ef7 --- /dev/null +++ b/app/controllers/cookbooks_controller.rb @@ -0,0 +1,54 @@ +class CookbooksController < ApplicationController + before_action :require_login, only: [:show, :edit] + before_action :find_cookbook, only: [:show, :edit, :update, :destroy] + + def new + @cookbook = Cookbook.new + end + + def create + @cookbook = Cookbook.create(cookbook_params) + @cookbook.user_id = session[:user_id] + + if @cookbook.save + redirect_to user_path(session[:user_id]) + else + flash[:name] = "Please provide a name for your cookbook." + render 'new' + end + end + + def show + session[:cookbook_id] = @cookbook.id + if session[:user_id] != @cookbook.user_id + redirect_to user_path(session[:user_id]) + end + + end + + def edit + @cookbook = Cookbook.find(params[:id]) + if session[:user_id] != @cookbook.user_id + redirect_to user_path(session[:user_id]) + end + end + + def update + @cookbook.update(cookbook_params) + redirect_to user_path(session[:user_id]) + end + + def destroy + @cookbook.destroy + redirect_to user_path(session[:user_id]) + end + + private + def find_cookbook + @cookbook = Cookbook.find(params[:id]) + end + + def cookbook_params + params.require(:cookbook).permit(:name, :description, {:recipe_ids => [] }) + end +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 00000000..72718156 --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,5 @@ +class HomeController < ApplicationController + def index + @recipes = Recipe.all + end +end diff --git a/app/controllers/ingredients_controller.rb b/app/controllers/ingredients_controller.rb new file mode 100644 index 00000000..c093b131 --- /dev/null +++ b/app/controllers/ingredients_controller.rb @@ -0,0 +1,63 @@ +class IngredientsController < ApplicationController + before_action :find_ingredient, only: [:show, :destroy] + before_action :require_login, only: [:new] + + def index + @ingredients = Ingredient.all.alphabet + end + + def edit + @ingredient = Ingredient.find(params[:id]) + if session[:user_id] != @ingredient.user_id + redirect_to ingredient_path(@ingredient) + end + end + + def update + @ingredient = Ingredient.find(params[:id]) + @ingredient.update(ingredient_params) + + if @ingredient.save + redirect_to user_path(session[:user_id]) + else + flash[:name] = "Please provide your ingredient name." + render :edit + end + end + + def show + @ingredient = find_ingredient + end + + def new + @ingredient = Ingredient.new + end + + def create + @ingredient = Ingredient.new(ingredient_params) + @ingredient.user_id = session[:user_id] + if @ingredient.save + redirect_to ingredient_path(@ingredient) + else + flash[:name] = "Please provide your ingredient name." + render :new + end + end + + def destroy + @ingredient.destroy + + redirect_to user_path(session[:user_id]) + end + + private + + def find_ingredient + @ingredient = Ingredient.find(params[:id]) + end + + def ingredient_params + params.require(:ingredient).permit(:name, :image) + end + +end diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb new file mode 100644 index 00000000..1f35da7e --- /dev/null +++ b/app/controllers/recipes_controller.rb @@ -0,0 +1,96 @@ +class RecipesController < ApplicationController + before_action :require_login, only: [:new, :add] + + def index + if params[:search] + @recipes = Recipe.search(params[:search]) + render :results + else + @recipes = Recipe.all.alphabet + render :index + end + end + + def edit + @recipe = Recipe.find(params[:id]) + if session[:user_id] != @recipe.user_id + redirect_to recipe_path(@recipe) + end + end + + def update + @recipe = Recipe.find(params[:id]) + @recipe.update(recipe_params) + + if @recipe.save + redirect_to user_path(session[:user_id]) + else + render :edit + end + + end + + def new + @user = User.find(session[:user_id]) + @recipe = Recipe.new(user_id: @user.id) + @ingredients = Ingredient.all + @cookbook = Cookbook.where(user_id: @user.id ) + end + + def show + @recipe = Recipe.find(params[:id]) + # @user = User.find(@recipe.user_id).username.capitalize + @user_recipes = User.find(@recipe.user_id).username.capitalize + @your_cookbook = User.find(session[:user_id]).cookbooks if session[:user_id] + end + + def add + @user = User.find(session[:user_id]) + @recipe = Recipe.find(params[:id]) + @cookbook = Cookbook.where(user_id: @user.id) + render :add + end + + def create + @recipe = Recipe.new(recipe_params) + @recipe.user_id = session[:user_id] + @recipe.validate + + if @recipe.valid? + @ingredient_recipe = (params[:recipe][:ingredient_ids].first).to_i + @recipe.ingredients << Ingredient.find(@ingredient_recipe) unless @ingredient_recipe != 0 + # This prevents anything from being saved if the user didn't input any ingredients for a recipe + @recipe.save + redirect_to user_path(session[:user_id]) + else + @cookbook = Cookbook.where(user_id: session[:user_id]) + @user = User.find(session[:user_id]) + @ingredients = Ingredient.all + @recipe = Recipe.new(user_id: @user.id) + render :new + end + end + + def remove_recipe + cookbook = Cookbook.find(session[:cookbook_id]) + recipe = Recipe.find(params[:recipe_id]) + + if cookbook + recipe.cookbooks.delete(cookbook) + redirect_to root_path + end + end + + def destroy + @recipe = Recipe.find(params[:id]) + @recipe.destroy + redirect_to user_path(session[:user_id]) + end + + private + + + def recipe_params + params.require(:recipe).permit(:user_id, :recipe_id, :name, :description, :image, :ingredients, :preparation, {:ingredient_ids => [] }, {:cookbook_ids => [] }) + end +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 00000000..7efafe70 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,22 @@ +class SessionsController < ApplicationController + def new + end + + def create + @user = User.find_by_username(params[:session][:username]) + + if @user && @user.authenticate(params[:session][:password]) + session[:user_id] = @user.id + redirect_to user_path(session[:user_id]) + else + flash.now[:error] = "Incorrect Username/Password Combination, Please Try Again." + render 'new' + end + end + + def destroy + session[:user_id] = nil + redirect_to login_path + end + +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 00000000..75e25850 --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,36 @@ +class UsersController < ApplicationController + before_action :require_login, only: [:show] + + def new + @user = User.new + end + + def create + @user = User.new(user_params) + @user.save + + if @user.save + redirect_to login_url + else + redirect_to signup_path + end + + end + + def show + @user = User.find(session[:user_id]) + @cookbooks = Cookbook.where(user_id: @user.id ) + @recipes = Recipe.where(user_id: @user.id ) + @ingredients = Ingredient.where(user_id: @user.id) + end + + def view + @user = User.find(params[:id]) + end + +private + + def user_params + params.require(:user).permit(:username, :password, :password_confirmation) + end +end diff --git a/app/helpers/cookbooks_helper.rb b/app/helpers/cookbooks_helper.rb new file mode 100644 index 00000000..d48e47c5 --- /dev/null +++ b/app/helpers/cookbooks_helper.rb @@ -0,0 +1,2 @@ +module CookbooksHelper +end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb new file mode 100644 index 00000000..23de56ac --- /dev/null +++ b/app/helpers/home_helper.rb @@ -0,0 +1,2 @@ +module HomeHelper +end diff --git a/app/helpers/ingredients_helper.rb b/app/helpers/ingredients_helper.rb new file mode 100644 index 00000000..dd54783a --- /dev/null +++ b/app/helpers/ingredients_helper.rb @@ -0,0 +1,2 @@ +module IngredientsHelper +end diff --git a/app/helpers/recipes_helper.rb b/app/helpers/recipes_helper.rb new file mode 100644 index 00000000..f526316e --- /dev/null +++ b/app/helpers/recipes_helper.rb @@ -0,0 +1,2 @@ +module RecipesHelper +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 00000000..309f8b2e --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 00000000..2310a240 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/cookbook.rb b/app/models/cookbook.rb new file mode 100644 index 00000000..a8845fbd --- /dev/null +++ b/app/models/cookbook.rb @@ -0,0 +1,10 @@ +class Cookbook < ActiveRecord::Base + # Associations ---------------------------------- + belongs_to :user + has_and_belongs_to_many :recipes + + # Validations ------------------------------------ + validates :name, presence: true + # Scope_____________________________________________ + +end diff --git a/app/models/ingredient.rb b/app/models/ingredient.rb new file mode 100644 index 00000000..41b50980 --- /dev/null +++ b/app/models/ingredient.rb @@ -0,0 +1,14 @@ +class Ingredient < ActiveRecord::Base + # uploader ------ + mount_uploader :image, ImageUploader + # Associations ---------------------------------- + has_and_belongs_to_many :recipes + belongs_to :user + + # Validations ------------------------------------ + validates :name, presence: true, uniqueness: true + + # Scopes ----------------------------------------- + scope :alphabet, -> { order('lower (name)') } + +end diff --git a/app/models/recipe.rb b/app/models/recipe.rb new file mode 100644 index 00000000..4d91d274 --- /dev/null +++ b/app/models/recipe.rb @@ -0,0 +1,26 @@ +class Recipe < ActiveRecord::Base + # uploader ------ + mount_uploader :image, ImageUploader + # Associations ---------------------------------- + has_and_belongs_to_many :ingredients + has_and_belongs_to_many :cookbooks + belongs_to :user + + # Validations ---------------------------------------------------------------- + validates :name, presence: true + validates :preparation, presence: true + validates_with RecipeValidator, :on => [:create, :update] + + # Scopes ----------------------------------------- + scope :alphabet, -> { order('lower (name)') } + scope :diff, -> { select(:ingredients).distinct.order(:ingredients).pluck(:ingredients) } + + # Mounted Objects_____________________________________________________________ + # mount_uploader :image, ImageUploader #instance of class image uploader + + def self.search(query) + where("name like ?", "%#{query}%" ) + end + + +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000..ad3fcccd --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,12 @@ +class User < ActiveRecord::Base + # Associations ---------------------------------- + has_many :cookbooks + has_many :recipes + has_many :ingredients + + has_secure_password + + validates :username, presence: true + + +end diff --git a/app/uploaders/image_uploader.rb b/app/uploaders/image_uploader.rb new file mode 100644 index 00000000..13cbd0e4 --- /dev/null +++ b/app/uploaders/image_uploader.rb @@ -0,0 +1,55 @@ +# 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('_')) + "default_256.png" + # "/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 => [75, 75] + end + + version :medium do + process :resize_to_fit => [500, 500] + 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/validators/recipe_validator.rb b/app/validators/recipe_validator.rb new file mode 100644 index 00000000..0a09948a --- /dev/null +++ b/app/validators/recipe_validator.rb @@ -0,0 +1,10 @@ +class RecipeValidator < ActiveModel::Validator + def validate(recipe) + # Do nothing for now. + # We must create an order before we create an order_item, + # so the initial order must temporarily not have any order items + unless recipe.ingredients.length >= 1 + recipe.errors.add(:ingredient, "recipe must have at least 1 ingredient") + end + end +end diff --git a/app/views/cookbooks/_form.html.erb b/app/views/cookbooks/_form.html.erb new file mode 100644 index 00000000..c9af0a02 --- /dev/null +++ b/app/views/cookbooks/_form.html.erb @@ -0,0 +1,26 @@ +<%= form_for @cookbook do |f| %> +
<%= recipe.description %>
+| + | Name | +Recipes | +
|---|---|---|
| <%= image_tag(@ingredient.image_url(:medium))%> | +<%= @ingredient.name %> | +<% @ingredient.recipes.each do |recipe| %>
+ <%= link_to "#{recipe.name}", recipe_path(recipe.id) %> + <% end %> + |
+