2015-12-01 3 views
0

Я новичок в Ruby и создаю простой администратор, используя ActiveAdmin. У меня есть модель Question, которую я хочу создать, заполнить и сохранить в базе данных, она имеет атрибут themes (массив моделей Theme). Когда пользователь создает новую запись, он не вводит темы вручную, а предоставляет некоторую строку, и система автоматически анализирует ее и находит или создает темы. Поэтому у меня есть такой код:ActiveAdmin получить значение из текстового поля формы

form do |f| 
    f.inputs "Questions Details" do 
     f.input :question, as: :string 
     f.input :autocomplete_themes, hint: "You should enter here multiple themes, 
     divide them with `,` or `;`" 
    end 
    f.actions 
end 

Это создает новое поле autocomplete_themes для ввода строки и оно не»существует в модели Question. Так что я хочу - это получить значение autocomplete_themes как строку, а затем использовать split() и мою собственную логику - но она дает ошибку.

before_create do |question| 
    array = [] 
    puts "******" 
    puts :autocomplete_themes.text 
    themeTitles = :autocomplete_themes.split(",") #split(/,|;/) 
    for title in themeTitles do 
     theme = Theme.find_by(title: title) 
     theme = Theme.create(title: title) unless theme 
     array << theme 
    end 
    question.themes = array 
end 

Вопрос: как я могу получить autocomplete_themes значение как строку? Спасибо!

Update: как я понял here - это похоже на случай похож, но есть проблема с установкой значения по умолчанию для пользовательских полей, но мне нужно, чтобы получить его значение из кода.

ответ

2

Вы не указали ошибку, которую вы получали, но на основании предоставленной вами информации вам не нужен autocomplete_themes, чтобы быть реальным атрибутом базы данных модели Question, но вам нужна только информация временно, поэтому что ваш фильтр before_create может использовать его для выполнения соответствующей логики.

Таким образом, вы можете сделать autocomplete_themes «виртуальным атрибутом», который похож на традиционную переменную-член экземпляра Question.

class Question < ActiveRecord::Base 
attr_writter :autocomplete_themes 
attr_reader :autocomplete_themes 

...other code 
end 

Это позволит вам делать такие вещи, как:

@question.autocomplete_themes = "1,2,3" 
themes_text = @question.auto_complete_themes 

И лучше всего, ActiveAdmin поддерживает имеющие формы входа назначаются для виртуальных атрибутов. Таким образом, вы можете держать свою форму, как это:

form do |f| 
f.inputs "Questions Details" do 
    f.input :question, as: :string 
    f.input :autocomplete_themes, hint: "You should enter here multiple themes, 
    divide them with `,` or `;`" 
end 
f.actions 
end 

И ваш before_filter будет выглядеть следующим образом:

before_create do |question| 
    array = [] 
    themeTitles = question.autocomplete_themes.split(",") #split(/,|;/) 
    for title in themeTitles do 
    theme = Theme.find_by(title: title) 
    theme = Theme.create(title: title) unless theme 
    array << theme 
    end 
    question.themes = array 
end 
Смежные вопросы