We've moved discussions to Discord

Disable Administrate Button

Bryan Stewart
Hi all.

Trying to find the proper view to disable a particular model new button based on how many are present. Has anyone done this before?

<% if Program.count < 1 %>
  <%= link_to 'New program', new_program_path %>
<% else %>
  <%= link_to 'Upgrade Plan', upgrade_plan_path %>
<% end %>

Richie Khoo
FWIW. Your code looks logical to me for what you say you're trying to do.
Bryan Stewart
i think so too,  , only question is where to drop it, since it appears that the administrate views are dynamically generated
Bryan Stewart
The below, I have read, should disallow the presentation of the NEW button.
I have found that the logic to check the program count is not being honored. It also is preventing the editing of the program created.  , what did I mess up here?
module Admin
  class ProgramsController < Admin::ApplicationController
    # Overwrite any of the RESTful controller actions to implement custom behavior
    # For example, you may want to send an email after a foo is updated.
    #
    # def update
    #   super
    #   send_foo_updated_email(requested_resource)
    # end
    # Override this method to specify custom lookup behavior.
    # This will be used to set the resource for the `show`, `edit`, and `update`
    # actions.
    #
    # def find_resource(param)
    #   Foo.find_by!(slug: param)
    # end
    def valid_action?(name, resource = resource_class)
      if Program.count >= 7
        %w[new].exclude?(name.to_s) && super
      end
    end
    # The result of this lookup will be available as `requested_resource`

    # Override this if you have certain roles that require a subset
    # this will be used to set the records shown on the `index` action.
    #
    # def scoped_resource
    #   if current_user.super_admin?
    #     resource_class
    #   else
    #     resource_class.with_less_stuff
    #   end
    # end

    # Override `resource_params` if you want to transform the submitted
    # data before it's persisted. For example, the following would turn all
    # empty values into nil values. It uses other APIs such as `resource_class`
    # and `dashboard`:
    #
    # def resource_params
    #   params.require(resource_class.model_name.param_key).
    #     permit(dashboard.permitted_attributes).
    #     transform_values { |value| value == "" ? nil : value }
    # end

    # See https://administrate-prototype.herokuapp.com/customizing_controller_actions
    # for more information
  end
end

Bryan Stewart
For those with similar questions:
rails generate administrate:views:index Program
<% if Program.count < 1 %>
  <div>
    <%= link_to(
      t(
        "administrate.actions.new_resource",
        name: display_resource_name(page.resource_name, singular: true).downcase
      ),
      [:new, namespace, page.resource_path.to_sym],
      class: "button",
    ) if valid_action?(:new) && show_action?(:new, new_resource) %>
  </div>
  <% end %>
Bryan Stewart
Hi all.

Trying to find the proper view to disable a particular model new button based on how many are present. Has anyone done this before?

<% if Program.count < 1 %>
  <%= link_to 'New program', new_program_path %>
<% else %>
  <%= link_to 'Upgrade Plan', upgrade_plan_path %>
<% end %>

Richie Khoo
FWIW. Your code looks logical to me for what you say you're trying to do.
Bryan Stewart
i think so too,  , only question is where to drop it, since it appears that the administrate views are dynamically generated
Bryan Stewart
The below, I have read, should disallow the presentation of the NEW button.
I have found that the logic to check the program count is not being honored. It also is preventing the editing of the program created.  , what did I mess up here?
module Admin
  class ProgramsController < Admin::ApplicationController
    # Overwrite any of the RESTful controller actions to implement custom behavior
    # For example, you may want to send an email after a foo is updated.
    #
    # def update
    #   super
    #   send_foo_updated_email(requested_resource)
    # end
    # Override this method to specify custom lookup behavior.
    # This will be used to set the resource for the `show`, `edit`, and `update`
    # actions.
    #
    # def find_resource(param)
    #   Foo.find_by!(slug: param)
    # end
    def valid_action?(name, resource = resource_class)
      if Program.count >= 7
        %w[new].exclude?(name.to_s) && super
      end
    end
    # The result of this lookup will be available as `requested_resource`

    # Override this if you have certain roles that require a subset
    # this will be used to set the records shown on the `index` action.
    #
    # def scoped_resource
    #   if current_user.super_admin?
    #     resource_class
    #   else
    #     resource_class.with_less_stuff
    #   end
    # end

    # Override `resource_params` if you want to transform the submitted
    # data before it's persisted. For example, the following would turn all
    # empty values into nil values. It uses other APIs such as `resource_class`
    # and `dashboard`:
    #
    # def resource_params
    #   params.require(resource_class.model_name.param_key).
    #     permit(dashboard.permitted_attributes).
    #     transform_values { |value| value == "" ? nil : value }
    # end

    # See https://administrate-prototype.herokuapp.com/customizing_controller_actions
    # for more information
  end
end

Bryan Stewart
For those with similar questions:
rails generate administrate:views:index Program
<% if Program.count < 1 %>
  <div>
    <%= link_to(
      t(
        "administrate.actions.new_resource",
        name: display_resource_name(page.resource_name, singular: true).downcase
      ),
      [:new, namespace, page.resource_path.to_sym],
      class: "button",
    ) if valid_action?(:new) && show_action?(:new, new_resource) %>
  </div>
  <% end %>
Notifications
You’re not receiving notifications from this thread.
© 2022 Jumpstart Pro by GoRails, LLC