0
votes

Im trying to use the policy design pattern but cant seem to get it to work. It's saying that my create method in undefined but cant figure out why. Please help: This is my policy file:

class GymClassPolicy < ApplicationPolicy
    attr_reader :user, :gym_class  
    def initialize(user, gym_class)
      @user = user
      @gym_class = gym_class
    end

    def create?
      user.admin?
    end


  end

This is my controller. I am trying to use the policy design pattern in the create method

require 'observer'
require './app/policies/gym_class_policy'


class GymClassesController < ApplicationController
  include Observable
  before_action :set_gym_class, only: [:show, :edit, :update, :destroy]

  # GET /gym_classes
  # GET /gym_classes.json
  def index
    @gym_classes = GymClass.all

  end




  # GET /gym_classes/1
  # GET /gym_classes/1.json
  def show
  end

  # GET /gym_classes/new
  def new
    @gym_class = GymClass.new

  end


  # GET /gym_classes/1/edit
  def edit
  end
  def gym_class_policy
    @_gym_class_policy ||= GymClassPolicy.new(gym_class)
  end 

  # POST /gym_classes
  # POST /gym_classes.json
  def create
    @gym_class = GymClass.new(gym_class_params)
    authorize @gym_class
    if @gym_class.create(gym_class_params)
      redirect_to @post
    else
      render :edit
    end



    respond_to do |format|
      if @gym_class.save
        format.html { redirect_to @gym_class, notice: 'Gym class was successfully created.' }
        format.json { render :show, status: :created, location: @gym_class }
      else
        format.html { render :new }
        format.json { render json: @gym_class.errors, status: :unprocessable_entity }
      end
    end




  end


  # PATCH/PUT /gym_classes/1
  # PATCH/PUT /gym_classes/1.json
  def update
    respond_to do |format|
      if @gym_class.update(gym_class_params)
        format.html { redirect_to @gym_class, notice: 'Gym class was successfully updated.' }
        format.json { render :show, status: :ok, location: @gym_class }

      else
        format.html { render :edit }
        format.json { render json: @gym_class.errors, status: :unprocessable_entity }
      end
    end
  end


  # DELETE /gym_classes/1
  # DELETE /gym_classes/1.json
  def destroy
    @gym_class.destroy
    respond_to do |format|
      format.html { redirect_to gym_classes_url, notice: 'Gym class was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_gym_class
      @gym_class = GymClass.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def gym_class_params
      params.require(:gym_class).permit(:Type, :PTName, :Date, :Time)
    end
    def Time=(new_Time)
      @Time = new_Time
      notify_observers(self)
    end

end

Lastly this is my full trace: ** activemodel (6.0.2.1) lib/active_model/attribute_methods.rb:431:in method_missing' app/controllers/gym_classes_controller.rb:43:increate' actionpack (6.0.2.1) lib/action_controller/metal/basic_implicit_render.rb:6:in send_action' actionpack (6.0.2.1) lib/abstract_controller/base.rb:196:inprocess_action' actionpack (6.0.2.1) lib/action_controller/metal/rendering.rb:30:in process_action' actionpack (6.0.2.1) lib/abstract_controller/callbacks.rb:42:inblock in process_action' activesupport (6.0.2.1) lib/active_support/callbacks.rb:135:in run_callbacks' actionpack (6.0.2.1) lib/abstract_controller/callbacks.rb:41:inprocess_action' actionpack (6.0.2.1) lib/action_controller/metal/rescue.rb:22:in process_action' actionpack (6.0.2.1) lib/action_controller/metal/instrumentation.rb:33:inblock in process_action' activesupport (6.0.2.1) lib/active_support/notifications.rb:180:in block in instrument' activesupport (6.0.2.1) lib/active_support/notifications/instrumenter.rb:24:ininstrument' activesupport (6.0.2.1) lib/active_support/notifications.rb:180:in instrument' actionpack (6.0.2.1) lib/action_controller/metal/instrumentation.rb:32:inprocess_action' actionpack (6.0.2.1) lib/action_controller/metal/params_wrapper.rb:245:in process_action' activerecord (6.0.2.1) lib/active_record/railties/controller_runtime.rb:27:inprocess_action' actionpack (6.0.2.1) lib/abstract_controller/base.rb:136:in process' actionview (6.0.2.1) lib/action_view/rendering.rb:39:inprocess' actionpack (6.0.2.1) lib/action_controller/metal.rb:191:in dispatch' actionpack (6.0.2.1) lib/action_controller/metal.rb:252:indispatch' actionpack (6.0.2.1) lib/action_dispatch/routing/route_set.rb:51:in dispatch' actionpack (6.0.2.1) lib/action_dispatch/routing/route_set.rb:33:inserve' actionpack (6.0.2.1) lib/action_dispatch/journey/router.rb:49:in block in serve' actionpack (6.0.2.1) lib/action_dispatch/journey/router.rb:32:ineach' actionpack (6.0.2.1) lib/action_dispatch/journey/router.rb:32:in serve' actionpack (6.0.2.1) lib/action_dispatch/routing/route_set.rb:837:incall' rack-pjax (1.1.0) lib/rack/pjax.rb:12:in call' remotipart (1.4.4) lib/remotipart/middleware.rb:32:incall' warden (1.2.8) lib/warden/manager.rb:36:in block in call' warden (1.2.8) lib/warden/manager.rb:34:incatch' warden (1.2.8) lib/warden/manager.rb:34:in call' rack (2.2.2) lib/rack/tempfile_reaper.rb:15:incall' rack (2.2.2) lib/rack/etag.rb:27:in call' rack (2.2.2) lib/rack/conditional_get.rb:40:incall' rack (2.2.2) lib/rack/head.rb:12:in call' actionpack (6.0.2.1) lib/action_dispatch/http/content_security_policy.rb:18:incall' rack (2.2.2) lib/rack/session/abstract/id.rb:266:in context' rack (2.2.2) lib/rack/session/abstract/id.rb:260:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/cookies.rb:648:in call' activerecord (6.0.2.1) lib/active_record/migration.rb:567:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/callbacks.rb:27:in block in call' activesupport (6.0.2.1) lib/active_support/callbacks.rb:101:inrun_callbacks' actionpack (6.0.2.1) lib/action_dispatch/middleware/callbacks.rb:26:in call' actionpack (6.0.2.1) lib/action_dispatch/middleware/executor.rb:14:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/actionable_exceptions.rb:17:in call' actionpack (6.0.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:32:incall' web-console (4.0.1) lib/web_console/middleware.rb:132:in call_app' web-console (4.0.1) lib/web_console/middleware.rb:28:inblock in call' web-console (4.0.1) lib/web_console/middleware.rb:17:in catch' web-console (4.0.1) lib/web_console/middleware.rb:17:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in call' railties (6.0.2.1) lib/rails/rack/logger.rb:38:incall_app' railties (6.0.2.1) lib/rails/rack/logger.rb:26:in block in call' activesupport (6.0.2.1) lib/active_support/tagged_logging.rb:80:inblock in tagged' activesupport (6.0.2.1) lib/active_support/tagged_logging.rb:28:in tagged' activesupport (6.0.2.1) lib/active_support/tagged_logging.rb:80:intagged' railties (6.0.2.1) lib/rails/rack/logger.rb:26:in call' sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/remote_ip.rb:81:in call' actionpack (6.0.2.1) lib/action_dispatch/middleware/request_id.rb:27:incall' rack (2.2.2) lib/rack/method_override.rb:24:in call' rack (2.2.2) lib/rack/runtime.rb:22:incall' activesupport (6.0.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in call' actionpack (6.0.2.1) lib/action_dispatch/middleware/executor.rb:14:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/static.rb:126:in call' rack (2.2.2) lib/rack/sendfile.rb:110:incall' actionpack (6.0.2.1) lib/action_dispatch/middleware/host_authorization.rb:83:in call' webpacker (4.2.2) lib/webpacker/dev_server_proxy.rb:23:inperform_request' rack-proxy (0.6.5) lib/rack/proxy.rb:57:in call' railties (6.0.2.1) lib/rails/engine.rb:526:incall' puma (4.3.1) lib/puma/configuration.rb:228:in call' puma (4.3.1) lib/puma/server.rb:681:inhandle_request' puma (4.3.1) lib/puma/server.rb:472:in process_client' puma (4.3.1) lib/puma/server.rb:328:inblock in run' puma (4.3.1) lib/puma/thread_pool.rb:134:in `block in spawn_thread' **

1

1 Answers

0
votes

Change create to save at app/controllers/gym_classes_controller.rb:43

@gym_class = GymClass.new(gym_class_params)
authorize @gym_class
if @gym_class.save(gym_class_params)
  redirect_to @post
...