Shane Andrade
Shane Andrade

Reputation: 2675

Use ActiveAdmin to edit a single record

I have a model that needs editing that is associated with the current user called BillingProfile. How can I add a menu item that links to the edit page of the current user's BillingProfile? I don't want or need an index page for the BillingProfile as a user can only edit their own.

class User
  has_one :billing_profile
end

Upvotes: 2

Views: 1625

Answers (3)

cortex
cortex

Reputation: 5224

You can use Cancan to manage the ability to allow a User to edit his own Billing Profile.

ability.rb

...
cannot :edit_billing_profile, User do |u|
  u.user_id != user.id
end
...

admin/users.rb

ActiveAdmin.register User do
  action_item :only => :show do
    link_to "Edit BP", edit_bp_path(user.id) if can? :edit_billing_profile, user
  end
end

Or you can try something like this:

ActiveAdmin.register User do
  form do |f|
    f.inputs "User" do
      f.input :name
    end
    f.inputs "Billing Profile" do
      f.has_one :billing_profile do |bp|
        w.input :address if can? :edit_billing_profile, bp.user
      end
    end
    f.buttons
  end
end

I have not test it, but I did something similar on a project.

Upvotes: 3

sjain
sjain

Reputation: 23356

This may help you-

Adding custom links:

ActiveAdmin.register User, :name_space => :example_namespace do
  controller do
    private
    def current_menu
      item = ActiveAdmin::MenuItem.new :label => "Link Name", :url => 'http://google.com'
      ActiveAdmin.application.namespaces[:example_namespace].menu.add(item)
      ActiveAdmin.application.namespaces[:example_namespace].menu
    end
  end
end

I basically created a new ActiveAdmin::MenuItem and add it to the current ActiveAdmin menu with the namespace example_namespace and return the menu in the end of the current_menu method. Note: current_menu is a method expected by ActiveAdmin so don't change the name of it. You can add as many items you like and each of these items will be converted to a link on your navigation header. Note this works for ActiveAdmin version > 0.4.3 so you might need to do your own digging if you want to do it for version <= 0.4.3.

Upvotes: 1

ianpetzer
ianpetzer

Reputation: 1838

I have a LinkHelper defined which has the following two methods:

#This will return an edit link for the specified object instance
def edit_path_for_object_instance(object_instance)
  model_name = object_instance.class.to_s.underscore
  path = send("edit_#{model_name}_path", object_instance)
end

#This will return an show link for the specified object instance
def show_path_for_object_instance(object_instance)
  model_name = object_instance.class.to_s.underscore
  path = send("#{model_name}_path", object_instance)
end

You can call the edit_path_for_object_instance method directly from your view and pass in the user.billing_profile object.

This will give you a link directly to the entity resulting a url like /billing_profile/ID/edit

An alternate approach is to use fields_for. This will allow you to create a form for the User attributes and update the associated BillingProfile at the same time. It would look something like this:

<%= form_for @user%>
  <%= fields_for @user.billing_profile do |billing_profile_fields| %>
    <%= billing_profile_fields.text_field :name %>    
  <% end %>
<%end%>

See here: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

Upvotes: 0

Related Questions