drhenner/ror_ecommerce

View on GitHub
app/controllers/admin/merchandise/products_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Admin::Merchandise::ProductsController < Admin::BaseController
  helper_method :sort_column, :sort_direction, :product_types
  authorize_resource

  def index
    params[:page] ||= 1
    @products = Product.admin_grid(params).order(sort_column + " " + sort_direction).
                                              paginate(page: pagination_page, per_page: pagination_rows)
  end

  def show
    @product        = Product.friendly.find(params[:id])
    @shipping_zones =  ShippingZone.all
    respond_to do |format|
      format.html
      format.json { render json: @product }
    end
  end

  def new
    form_info
    if @prototypes.empty?
      flash[:notice] = "You must create a prototype before you create a product."
      redirect_to new_admin_merchandise_prototype_url
    else
      @product            = Product.new
      @product.prototype  = Prototype.new
    end
  end

  def create
    @product = Product.new(allowed_params)

    if @product.save
      flash[:notice] = "Success, You should create a variant for the product."
      redirect_to edit_admin_merchandise_products_description_url(@product)
    else
      form_info
      flash[:error] = "The product could not be saved"
      render action: :new
    end
  rescue
    render :text => "Please make sure you have solr started... Run this in the command line => bundle exec rake sunspot:solr:start"
  end

  def edit
    @product        = Product.friendly.includes(:properties,:product_properties, {:prototype => :properties}).find(params[:id])
    form_info
  end

  def update
    @product = Product.friendly.find(params[:id])

    if @product.update_attributes(allowed_params)
      redirect_to admin_merchandise_product_url(@product)
    else
      form_info
      render action: :edit#, :layout => 'admin_markup'
    end
  end

  def add_properties
    prototype  = Prototype.friendly.includes(:properties).find(params[:id])
    @properties = prototype.properties
    all_properties = Property.all

    @properties_hash = all_properties.inject({:active => [], :inactive => []}) do |h, property|
      if  @properties.detect{|p| (p.id == property.id) }
        h[:active] << property.id
      else
        h[:inactive] << property.id
      end
      h
    end
    respond_to do |format|
      format.html
      format.json { render json: @properties_hash.to_json }
    end
  end

  def activate
    @product = Product.friendly.find(params[:id])
    @product.deleted_at = nil
    if @product.save
      redirect_to admin_merchandise_product_url(@product)
    else
      if @product.description.blank?
        flash[:alert] = "Please add a description before Activating."
      else
        flash[:alert] = @product.errors.full_messages.join('  ')
      end
      redirect_to edit_admin_merchandise_products_description_url(@product)
    end
  end

  def destroy
    @product = Product.friendly.find(params[:id])
    @product.deleted_at ||= Time.zone.now
    @product.save

    redirect_to admin_merchandise_product_url(@product)
  end

  private

    def allowed_params
      params.require(:product).permit(:name, :description, :product_keywords, :set_keywords, :product_type_id,
                                      :prototype_id, :shipping_category_id, :permalink, :available_at, :deleted_at,
                                      :meta_keywords, :meta_description, :featured, :description_markup, :brand_id,
                                      product_properties_attributes: [:id, :product_id, :property_id, :position, :description])
    end

    def form_info
      @prototypes               = Prototype.all.map{|pt| [pt.name, pt.id]}
      @all_properties           = Property.all
      @select_shipping_category = ShippingCategory.all.map {|sc| [sc.name, sc.id]}
      @brands                   = Brand.order(:name).map {|ts| [ts.name, ts.id]}
    end

    def product_types
      @product_types ||= ProductType.all
    end

    def sort_column
      Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
    end

end