Sha256: 8a17bc680e5d92f29a1553cb260f64f5069605168133b1621dd51c3ec02b39e5

Contents?: true

Size: 1.99 KB

Versions: 1

Compression:

Stored size: 1.99 KB

Contents

module OnTheSpot
  module ControllerExtension

    def self.included(base)
      base.extend ClassMethods
    end

    # if this method is called inside a controller, the edit-on-the-spot
    # controller action is added that will allow to edit fields in place
    module ClassMethods
      def can_edit_on_the_spot(check_acces_method=nil)
        define_method :update_attribute_on_the_spot do
          klass, field, id = params[:id].split('__')
          select_data = params[:select_array]
          display_method = params[:display_method]

          object = klass.camelize.constantize.find(id)

          is_allowed = check_acces_method.present? ? self.send(check_acces_method, object, field) : true

          if is_allowed
            if object.update_attributes(field => params[:value])
              if select_data.nil?
                field_or_method = if display_method.present?
                                    object.send(display_method)
                                  else
                                    CGI::escapeHTML(object.send(field).to_s)
                                  end
                render :text => field_or_method
              else
                parsed_data = JSON.parse(select_data.gsub("'", '"'))
                render :text => parsed_data[object.send(field).to_s]
              end
            else
              render :text => object.errors.full_messages.join("\n"), :status => 422
            end
          else
            render :text => "Acces is not allowed", :status => 422
          end
        end

        define_method :get_attribute_on_the_spot do
          klass, field, id = params[:id].split('__')

          object = klass.camelize.constantize.find(id)

          is_allowed = check_acces_method.present? ? self.send(check_acces_method, object, field) : true

          if is_allowed
            render :text => object.send(field)
          else
            render :text => "Acces is not allowed", :status => 422
          end
        end
      end
    end
    
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
on_the_spot-0.0.18 lib/on_the_spot/controller_extension.rb