make column of associated resource in index table non-linked - activeadmin

Okay, using ActiveAdmin (0.6.3) and am able to use the following code to get a caller's location attribute to appear in the table of callers. The name of each location appears as a link to the "show" action for the location. The "show" action and result is not useful for my application. I want to remove the link but keep the text. Help? Thanks :)
ActiveAdmin.register Caller do
index do
column 'Location', :location, :sortable => 'locations.name'
end
controller do
def scoped_collection
resource_class.includes(:location)
end
end
end
class Caller < ActiveRecord::Base
attr_accessible :active, :assignedname, :callingnumber, :description, :location_id, :lookupcount, :lastlookuptime
belongs_to :location
end
class Location < ActiveRecord::Base
attr_accessible :active, :description, :name, :callers_attributes
has_many :callers, dependent: :destroy
end

Try this.
index do
column 'Location', :sortable => 'locations.name' do |caller|
caller.location.name
end
end

Related

Customising just a single property in a Resource

I have a simple Rails Model which has several columns in the database. I then have an ActiveAdmin Resource for this model and by default it renders me a nice index, show and form views with all of the columns and I'm able to do all the standard CRUD operations.
Is it possible to customise one of the columns without overwriting index, show and form functions and writing out all of the individual columns again?
For example if I want to change how a single column is rendered I know I can do this:
ActiveAdmin.register Product do
permit_params :name, :description, :price, :weight
index do
selectable_column
column :id
column :name
column :description
column :price do |f|
text_field "#{f.price} EUR"
end
end
show do
row :id
row :name
row :description
row :price do |f|
text_field "#{f.price} EUR"
end
row :weight
end
end
But I would instead like to do something like this:
ActiveAdmin.register Product do
permit_params :name, :description, :price, :weight
# param_view is (to my knowlege) an imaginary method
param_view :price do |p|
text_field "#{f.price} EUR"
end
end
Is this somehow possible? What about just hiding a single property?

Rails Admin filtering multiselect

I have a model with these associations:
has_many :ad_places, dependent: :destroy
has_many :places, through: :ad_places
And in my Rails Admin initializer:
edit do
field :places do
inline_add false
associated_collection_cache_all true
associated_collection_scope do
Proc.new do |scope|
scope = scope.order(:place_on_page)
end
end
end
field :html, :text
field :document
end
But my entries on the multiselect are not ordered by place_on_page, the request that does Rails Admin is ORER by places.id desc
It's basically the same configuration than this guy that's been fixed by this fix except that it doesn't work for me.
Do I miss something?
Check the logs on development to see what SQL is being generated, probably there's another ordering somewhere. to fix that try:
scope = scope.reorder(:place_on_page)

uninitialized constant [Active Admin]

I have error message "uninitialized constant Slideapp::Appinfos"
My database have 2 table is appinfo and slideapp.This is code in my model
class Appinfo < ActiveRecord::Base
has_many :slideapps
accepts_nested_attributes_for :slideapps
end
class Slideapp < ActiveRecord::Base
belongs_to :appinfos
end
How do I fix this problem ?
This is unrelated to ActiveAdmin.
Your belongs_to should use the singular form of Appinfo:
class Slideapp < ActiveRecord::Base
belongs_to :appinfo # <= use of singular Appinfo
end
As it is now Rails is trying to autoload the class Appinfos, which doesn't exist.

ActiveAdmin won't save has many and belongs to many field

I have 2 models. Category and Post. They are connected using a has_many_and_belongs_to_many relationship. I checked in the rails console and the relationship works.
I created checkboxes in activeadmin to set the post categories using this form field:
f.input :categories, as: :check_boxes, collection: Category.all
The problem is when I try to save it because every other field data (title, body, meta infos etc.) is saved, but the category stays the same even if I unchecked it, or checked another too.
I am using strong parameters like this:
post_params = params.require(:post).permit(:title,:body,:meta_keywords,:meta_description,:excerpt,:image,:categories)
Please give me some suggestions to make active admin save the categories too!
Best Wishes,
Matt
Try this in AA:
controller do
def permitted_params
params.permit post: [:title, :body, :meta_keywords, :meta_description, :excerpt, :image, category_ids: []]
end
end
Put something like this in /app/admin/post.rb:
ActiveAdmin.register Post do
permit_params :title, :body, :meta_keywords, :meta_description, :excerpt, :image, category_ids: [:id]
end
If you are using accepts_nested_attributes_for then it would look like this:
ActiveAdmin.register Post do
permit_params :title, :body, :meta_keywords, :meta_description, :excerpt, :image, categories_attributes: [:id]
end
I've tested, this might works for you and others as well
# This is to show you the form field section
form do |f|
f.inputs "Basic Information" do
f.input :categories, :multiple => true, as: :check_boxes, :collection => Category.all
end
f.actions
end
# This is the place to write the controller and you don't need to add any path in routes.rb
controller do
def update
post = Post.find(params[:id])
post.categories.delete_all
categories = params[:post][:category_ids]
categories.shift
categories.each do |category_id|
post.categories << Category.find(category_id.to_i)
end
redirect_to resource_path(post)
end
end
Remember to permit the attributes if you're using strong parameters as well (see zarazan answer above :D)
References taken from http://rails.hasbrains.org/questions/369

rails_admin searchable association

I am using rails_admin together with globalize3 and cannot get searchable associations to work. Here are the models (Person has_one/belongs_to Name has_many/belongs_to NameTranslation):
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
end
class Name < ActiveRecord::Base
belongs_to :person, inverse_of: :name
translates :first_name, :last_name
has_many :name_translations, inverse_of: :name, dependent: :destroy
end
class NameTranslation < ActiveRecord::Base
belongs_to :name, inverse_of: :name_translations
end
The NameTranslation model is coming from globalize3, it contains the same attributes as name (first_name and last_name) plus locale and name_id,.
In config/initializers/rails_admin.rb I have
config.model Person do
list do
field :name do
searchable name_translations: :last_name
end
end
end
Then, in the GUI, when I add a filter on name, I get:
SQLite3::SQLException: no such column: name_translations.last_name: SELECT "people".* FROM "people" WHERE (((name_translations.last_name LIKE '%freud%'))) ORDER BY people.id desc LIMIT 20 OFFSET 0
Obviously, rails_admin is looking for a column named name_translations.last_name in people instead of joining/including names and name_translations - why?
What I need rails_admin to do is this, working in irb:
>> Person.joins( name: :name_translations ).where('name_translations.last_name like "test"')
which generates the following SQL:
SELECT "people".* FROM "people" INNER JOIN "names" ON "names"."person_id" = "people"."id" INNER JOIN "name_translations" ON "name_translations"."name_id" = "names"."id" WHERE (name_translations.last_name like "test")
Can this be done in rails_admin? Thanks for your help...
From this thread, I followed Nick Roosevelt's suggestion and it worked for my case
class Room < ActiveRecord:Base
has_many :time_slots
end
class TimeSlot < ActiveRecord::Base
belongs_to :room
rails_admin do
list do
field :day do
searchable true
end
# field :room do
# searchable room: :name
# end
field :room do
searchable [{Room => :name}]
queryable true
end
end
end
end
I tried searchable room: :name and it was not working, but searchable [{Room => :name}] seem to make it work.
I had a similar problem with a has one relationship.
The way I solved it was to set a default_scope on the model and join it with the associated table (it is was the only way I could get rails admin to join these two tables).
I also had to set queryable true on the associated field.
Imagine that you had to search only inside the name association, then here's how it would work:
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
default_scope { eager_load(:name) }
end
config.model Person do
list do
field :name do
queryable true
searchable [:column1, :column2, ..]
end
end
end
However, you need to search through the has many association and I don't know whether that approach would still work, but here's a guess:
class Person < ActiveRecord::Base
has_one :name, inverse_of: :person
has_many :name_translations, through: :name
default_scope { eager_load(:name_translations) }
end
config.model Person do
list do
field :name_translations do
queryable true
searchable :last_name
end
end
end

Resources