administrate icon indicating copy to clipboard operation
administrate copied to clipboard

Defining different attributes for `new`/`create` or `edit`/`update` actions without defining `FORM_ATTRIBUTES` makes it crash

Open pjmartorell opened this issue 4 years ago • 5 comments

  • What were you trying to do? Upgraded from 0.13 to main (9e462f7179f47151d1b91aab59291e6884870dab). I tried to define different attributes for new/create or edit/update actions as stated here: https://github.com/thoughtbot/administrate/blob/main/docs/customizing_dashboards.md#form-attributes

    When trying to update or create a record in the dashboard, there is a crash. This is because, when validating permitted attributes, it's trying to get these attributes from self.class::FORM_ATTRIBUTES but it should get them from "FORM_ATTRIBUTES_#{action.upcase}" as FORM_ATTRIBUTES is not defined anymore. specific_form_attributes_for(action) is returning nil because action is not being passed in permitted_attributes. So the solution is to pass the action_name when checking permitted attributes.

  • What did you end up with (logs, or, even better, example apps are great!)? The affected code is related with https://github.com/thoughtbot/administrate/pull/1991 Logs: Screenshot_2021-11-23_at_12_43_43

    My workaround: In my UserDashboard added the following overrides:

    def permitted_attributes(action)
      action =
        case action
        when "update" then "edit"
        when "create" then "new"
        else action
        end
    
      form_attributes(action).map do |attr|
        attribute_types[attr].permitted_attribute(
          attr,
          resource_class: self.class.model
        )
      end.uniq
    end
    
    def form_attributes(action = nil)
      specific_form_attributes_for(action) || self.class::FORM_ATTRIBUTES
    end
    
    def specific_form_attributes_for(action)
      return unless action
    
      cname = "FORM_ATTRIBUTES_#{action.upcase}"
    
      self.class.const_get(cname) if self.class.const_defined?(cname)
    end
    

    In my Admin::UsersController add the following override:

    def resource_params
      params.require(resource_class.model_name.param_key)
            .permit(dashboard.permitted_attributes(action_name))
            .transform_values { |v| read_param_value(v) }
    end
    
  • What versions are you running?

    • Rails: 6.1.3.1
    • administrate (9e462f7179f47151d1b91aab59291e6884870dab)

pjmartorell avatar Nov 23 '21 12:11 pjmartorell

Thank you for the report @pjmartorell. It looks like we could have used a feature spec there. Do you think you'd be able to provide a PR?

pablobm avatar Dec 28 '21 08:12 pablobm

yes, now that I'm on holidays I'll probably have time to do a PR 😅👍

pjmartorell avatar Dec 28 '21 09:12 pjmartorell

@pjmartorell do you still plan on making a PR? I might be up for making one if not.

jordan-brough avatar Jan 24 '22 14:01 jordan-brough

@jordan-brough that would be great 👍 I just run into this issue too.

nunocarvalhog avatar Mar 18 '22 18:03 nunocarvalhog

@jordan-brough - Go for it! :rocket:

pablobm avatar Mar 31 '22 13:03 pablobm

fixed by https://github.com/thoughtbot/administrate/issues/2352

pablobm avatar Apr 19 '23 14:04 pablobm