2016-03-26 2 views
1

У меня есть модель Group и модель Message, каждая из которых - HABTM. Я пытаюсь установить валидацию для своей основной формы, которая заключается в отправке SMS-сообщения определенным группам. Прямо сейчас у меня есть тело сообщения, проверенное с помощью presence: true, которое работает нормально, но в моей модели группы я хочу проверить имя, которое будет присутствовать, но как заставить их проверять, когда я вызываю метод create в контроллере сообщений? Я покажу свой код для уточнения.Настройка проверки правильности. Использование двух моделей в одном виде

Вот group.rb

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :people 
    has_and_belongs_to_many :messages 
    validates :name, presence: true 
    end 

Теперь message.rb

class Message < ActiveRecord::Base 
    has_and_belongs_to_many :groups 

    validates :body, presence: true 
end 

Вот мой message_controller.rb

def create 
@message = Message.create(message_params) 
if @message.save 
    run_at_time = @message.send_at.present? ? @message.send_at : Time.zone.now 
    people = Person.in_groups(message_params[:group_ids]) 
    if people.any? 
    people.each do |person| 
     person.delay(run_at: run_at_time).send_message(@message.body) 
    end 
    flash[:success] = "Messages on their way!" 
    end 
    redirect_to root_path 
else 
    render "new" 
end 
end 

enter image description here

Для большего понимания я хочу, чтобы моя форма отображалась как «Группы не могут быть пустыми», а также «Тело не может быть пустым». Если ничего не выбрано.

ответ

1

Использование valid? было первым, что пришло на ум, но есть и другой способ.

Валидации модели фактически имеют встроенную поддержку для асоциаций.

Например,

class Message 
    has_and_belongs_to_many :groups 
    validates :groups, presence: true 
end 

См this StackOverflow answer.

Так что это приведет к ошибке save, если в сообщении не было групп.

Всегда есть другой способ - вы можете переопределить valid?, который называется внутри save. Например:

class Message 
    def valid?(*args) 
    original_result = super(*args) 
    if self.groups.empty? 
     self.errors_add(:groups, "cannot be empty") 
     return false 
    end 
    return original_result 
    end 
end 

Это в значительной степени то же самое достигается validates :groups, presence: true, хотя я думаю presence: true также проверить, что внешние ключи относятся к действительных записей (а не просто проверить, что любые связанные записи существуют).

Вызов valid? имеет побочный эффект при загрузке объекта errors. Например:

msg = Message.new 
    msg.errors.full_messages # => [] 
    msg.valid? # => false 
    msg.errors.full_messages # => ["Name cant be blank", "Groups cant be blank"] 
    msg.save # => false 
2

Если вы хотите проверить несколько моделей перед сохранением или сбором всех ошибок, вы можете сделать это, используя метод model.valid?. Он вернет true для false, в зависимости от наличия ошибок. И ошибки будут добавлены к model.errors.

Смежные вопросы