2016-03-30 4 views
0

У меня есть Active Admin gem для моего ruby ​​on rails project. То, что я хотел бы сделать, это создать продукт и иметь 2 блока выбора (1-Категория, 2-Департамент) в той форме, где вторая изменяет его содержимое на основе первого. После бесчисленных часов поиска я все еще не могу заставить это работать.Active Admin inested select

class Product < ActiveRecord::Base 
belongs_to :category, dependent: :destroy, counter_cache: true 
has_one :department, through: :category 
end 

class Category < ActiveRecord::Base 
belongs_to :department, counter_cache: true 
has_many :products 
end 

class Department < ActiveRecord::Base 
end 

Поэтому я хотел бы сделать это потому, что некоторые отделы могут иметь такое же название категории, которая была бы запутанным и было бы добавить продукт в неправильном отделе.

Я попытался question 9579402, но, как я понимаю его вопрос в том, что у него была только две модели, и он создает подкатегорию из выбранной категории

Heres знакомой вещи, но он использует запрос прибудет АЯКС Git/Dglgmut/6328501

Попытка question 9579402 получить мне ошибку:

Started POST "/admin/products/change_categories" for ::1 at 2016-03-30 14:51:09 +0300 
ActionController::RoutingError (No route matches [POST] "/admin/products/change_categories"): 

Это то, что я имею в routes.rb

routes.rb = post 'change_categories'  =>'products#change_categories' 
http://localhost:3000/rails/info/routes = change_categories_path POST /change_categories(.:format) products#change_categories 

Я думаю, это потому, что я могу использовать действия членов для активного администратора, поэтому я попытался его

member_action :change_categories, :method => :get do 
    @categories = Department.find_by_id(params[:department_id]).try(:categories) 
    render :text=>view_context.options_from_collection_for_select(@categories, :id, :category_number) 
end 

Но получил ту же ошибку, как и раньше. Любая помощь будет оценена, спасибо.

UPDATE: Im новичок в этом, но если им-правильные, change_categories должны быть в категории контроллера, потому что ищет этот метод в контроллере продукта,

POST "/admin/products/change_categories" 

Поэтому я добавил категории ресурсов для активного администратора и добавил этот метод к категории контроллеров, но есть ли теперь способ использовать этот контроллер? Что-то вроде:

f.input :department, :input_html => { :onchange => remote_request(controller => "categories", :post, :change_categories, {:department_id=>"$('#department_id').val()"}, :category_id) } 
+0

Я думаю, что добавление 'get '/ admin/products/change_categories" => "products # change_categories" 'будет выполнять вашу работу –

ответ

0

Итак, после бесчисленных часов мне удалось заставить это работать. Я думаю, проблема была в старых версиях или разнице между моделями, откуда я взял код. Поэтому в Active Admin вместо member_action я использовал collection_action, который имеет больше смысла в маршрутизации, потому что member_action создает маршрут /admin/products/:id/change_categories(.:format) , который мешает действию show и использует его вместо action_change.

Так Heres collection_action:

collection_action :change_categories, :method => :get do 
@categories = Category.where("department_id = ?", Department.find(params[:product_department_id])) 
render :text => view_context.options_from_collection_for_select(@categories, :id, :name) 
end 

Это создает правильный маршрут админ/продукты/change_categories, где я теперь могу пройти Params [: product_departmemnt_id], который выбран идентификатор из отборной коробки.

Это где он получает Id от:

f.input :description 
    f.input :department, prompt: "Select department", :input_html => { 
    onchange: remote_get("change_categories", 'product_department_id', :product_category_id) 
} 
    f.input :category 

Подсказка для некоторых АЯКС начинающих, убедитесь, чтобы проверить исходный код страницы, чтобы увидеть, если вы используете правильный идентификатор или класс, или любой другой, это вызвало головные боли для меня.

Следующая вещь, которую вы хотите добавить, - это вспомогательный метод, есть два способа сделать это, либо в application_helper.rb, либо в приложении/помощниках. Если вы добавите его в appication_helper.rb вы должны включить его в конфиг/инициализаторами/active_admin.rb инициализатор:

ActiveAdmin.setup do |config| 
    .... 
    some config 
    .... 
end 

module ActiveAdmin::ViewHelpers 
    include ApplicationHelper 
end 

Но тогда имеет доступ ко всем его вспомогательных методов необходимы, которые я не думаю, или может/не может замедлить его, поэтому я создал новую папку приложения/хелперов, называемых «active_admin» и создал файл «form_helper.rb», где находится этот код из Dglgmut/6328501 git

def remote_get(path, member,target_tag_id) 
"$.get('#{path}/?#{member}=' + $('##{member}').val(), 
    function(data) {$('##{target_tag_id}').html(data);} 
);" 
end 

не знаю много о JS , но я предполагаю, что это делает запрос на admin/products/change_categories /? product_department_id = 1, а остальное - вспомогательным методом. Если кто-то наткнется на это, я надеюсь, что это поможет вам и вам нужна информация. Я также предлагаю вам так называемую «резиновую утку» отладки, никаких шуток, это иногда помогает.

+0

PS: Active admin требует перезагрузки сервера после добавления или редактирования (я думаю) вспомогательных методов. –

0

Проблема заключается в том, что ваш метод member_action является «get», и вы отправляете его на контроллер. Переход от «POST» к запросу Get должен решить проблему.

+0

Вот что он выплевывает сейчас: Начато GET"/admin/products/change_categories "для :: 1 at 2016-03-30 15:28:56 +0300 Обработка по администратора :: ProductsController # показать как */* Параметры: {"id" => "change_categories"} Продукт Загрузка (0.7ms) SELECT " ". * FROM" products "WHERE" products "." Id "=? LIMIT 1 [["id", 0]] Завершено 404 Не найдено за 12 мс (ActiveRecord: 1,1 мс) ActiveRecord :: RecordNotFound (не удалось найти продукт с 'id' = change_categories): –

+0

удалить пост 'change_categories' from routes.rb. member_action добавит маршруты active_admin. добавьте ActiveAdmin.routes (self) в нижней части маршрута.rb, если его там нет. – Shishir

+0

вставьте свой файл 'routes.rb', чтобы просто отпустить и поделиться ссылкой. –