2016-01-30 2 views
1

У меня есть поле формы, в котором пользователь вводит строку с тегами "foo, bar, foobar". Это отправляется контроллеру как item_params[:tag_list]. В контроллере мое действие create включает в себя @item = Item.create(tag_list: item_params[:tag_list]). Это приводит к тому, что атрибут tag_list заполняется как массив строк ["foo", "bar", "foobar"].Rails - атрибут массива Render как строка при неудачной проверке

Если проверка не удалась, мне нужно ввести поле формы, которое будет заполнено "foo, bar, foobar", а не массив строк. Есть ли способ манипулировать этим, прежде чем он вернется, чтобы заполнить поле формы, которая не прошла проверку?

+0

что проверка? –

ответ

0

Вы используете acts-as-taggable-on gem? Надежда эта линия может решить вам проблему

f.text_field :tag_list, value: f.object.tag_list.join(', ') 

Или вы должны переопределить метод tag_list в Item модели

alias_method :array_tag_list, :tag_list 
def tag_list 
    array_tag_list.join(', ') 
end 
+0

Я не смог заставить ваше предложение работать. Возможно, это связано с тем, что я использую вставки тегов bootstrap, и это вызывает проблему. Я смог решить свою проблему, изменив атрибут tag_list на строку, если проверка не удалась. Я сделал это в контроллере '@ item.tag_list.remove (item_params [: tag_list], parse: true)' then '@ item.tag_list.add (item_params [: tag_list])' – user4584963

+0

Я думаю, вам нужно переопределить ' tag_list' в модели 'Item'. 'alias_method: array_tag_list,: tag_list def tag_list array_tag_list.join (',') end' –

0

Очень удивлен, что пары в настоящее время рассматриваются как массив.


К сожалению, неправильно ваш вопрос (предположительно вы хотите сообщение проверки). Уйдет для потомков:

Всякий раз, когда вы используете validation, вы получите доступ к three interpolations: value, attribute & model:

#app/models/item.rb 
class Item < ActiveRecord::Base 
    validates :tag_list, x: { message: "%{value} is not valid" } 
end 

Согласно docs, вы можете передать Proc для прямого манипулирования:

#app/models/item.rb 
class Item < ActiveRecord::Base 
    validates :tag_list, x: { message: ->(key, data) do 
     "#{data[:value].join} is not valid" 
    end 
    } 
end 

-

Для того, чтобы заполнить поле, вы хотите использовать атрибут атрибута value, заселение с data from the form object:

= text_field :tag_list, value: f.object.tag_list.join 
Смежные вопросы