2013-07-03 3 views
8

난과 같이 ActiveAdmin을의 formtastic를 통해 동적 선택 옵션을하고 싶습니다 선택

form do |f| 
    f.inputs "Exam Registration Details" do 
     f.input :user_id, :as => :select, :collection => User.where(:admin => 'false') 
     #selects user from list. WORKING 

     f.input :student_id, :as => :select, :collection => Student.joins(lessons: :user) 
     #collection of students will change to students who have lessons with chosen user. NOT WORKING, returns all students who have lessons. 

     f.input :lesson_id, :as => :select, :collection => Lesson.joins(:student, :user) 
     #collection of lessons will change to reflect lessons connected by chosen user and student. NOT WORKING, returns all lessons. 
    end 
    f.buttons 
    end 

내 아마추어 코드가 분명히 작동하지 않습니다 내가가 의도 한대로. 내가 어떤 변화를해야합니까?

나는 다음과 같이 4 개 모델을 가지고 :

class Student < ActiveRecord::Base 
    has_many :lessons 
    has_many :users, through: :lessons 
    has_many :exam_registrations, through: :lessons 

class Lesson < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :student 
    belongs_to :exam_registration 

class User < ActiveRecord::Base 
    has_many :lessons 
    has_many :students, through: :lessons 
    has_many :exam_registrations, through: :lessons 

class ExamRegistration < ActiveRecord::Base 
    has_many :lessons 
    has_many :users, through: :lessons 
    has_many :students, through: :lessons 

답변

5

같은 문제와 씨름 다른 누군가를 위해

해결이 railscast

보고 여기에 내가 ActiveAdmin을 여러 동적 선택 메뉴를 구현하는 방법은 예 :

config.register_javascript 'exam_registrations.js.coffee' 

응용 프로그램/관리/exam_registrations.rb

form do |f| 
    f.inputs "Exam Registration Details" do 
     f.input :user_id, :label => 'Teacher', :as => :select, :collection => User.where(:admin => 'false', :active => true).order(:name), :include_blank => true 
     f.input :student_id, :hint => 'Students grouped by teacher names', :as => :select, :collection => option_groups_from_collection_for_select(User.where(:admin => false, :active => true).order(:name), :students, :name, :id, :name) 
     f.input :lesson_id, :hint => 'Lessons grouped by student names', :as => :select, :collection => option_groups_from_collection_for_select(Student.where(:active => true).order(:name), :lessons, :name, :id, :name) 
    end 
    f.buttons 
    end 

응용 프로그램/자산/자바 스크립트/exam_registrations.js.coffee

#first menu  
jQuery -> 
     $('#exam_registration_student_id').parent().hide() 
     students = $('#exam_registration_student_id').html() 
     $('#exam_registration_user_id').change -> 
     user = $('#exam_registration_user_id :selected').text() 
     escaped_user = user.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1') 
     options = $(students).filter("optgroup[label='#{escaped_user}']").html() 
     if options 
      $('#exam_registration_student_id').html(options) 
      $('#exam_registration_student_id').parent().show() 
     else 
      $('#exam_registration_student_id').empty() 
      $('#exam_registration_lesson_id').empty() 

# second menu 
    $('#exam_registration_lesson_id').parent().hide() 
    lessons = $('#exam_registration_lesson_id').html() 
    $('#exam_registration_student_id').click -> 
    student = $('#exam_registration_student_id :selected').text() 
    escaped_student = student.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1') 
    options = $(lessons).filter("optgroup[label='#{escaped_student}']").html() 
    if options 
     $('#exam_registration_lesson_id').html(options) 
     $('#exam_registration_lesson_id').parent().show() 
    else 
     $('#exam_registration_lesson_id').empty() 

서버를 다시 시작하고 메뉴 작업 !

+1

정보를 주셔서 감사합니다.이 사소한 변경 후 저에게 도움이되었습니다. 'config.register_javascript 'exam_registrations'' – blotto

+0

다행스럽게 도울 수 있어요! –

+0

@ Ryan.lay : http://stackoverflow.com/questions/28187354/active-admin-populate-one-of-the-second-drop-down-after-first를 참조하십시오. – inquisitive