2013-04-06 2 views
2

У меня есть форма:Как изменить значение поля формы перед сохранением в db?

<%= form_for(@event) do |f| %> 
    <div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </div> 

    <div class="field"> 
    <%= f.label :date %><br /> 
    <%= f.text_field :date %> 
    </div> 

    <div class="field"> 
    <%= f.label :repeat %><br /> 
    <%= repeat_types = ['none', 'daily', 'monthly', 'yearly'] 
     f.select :repeat, repeat_types %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

мне нужно сохранить в поле «Repeat» измененные данные, как:

:repeat = Event.rule(:date,:repeat) 

Где и как я могу изменить поле повторения перед сохранением в базе данных?

ответ

4

В общем, если вам нужно немного изменить данные от того, что вводится пользователем в форму перед сохранением в базе данных, вы можете сделать это в Rails, используя ActiveRecord callbacks такие как before_save. Например, вы могли бы иметь следующее:

class Event < ActiveRecord::Base 
    before_save :set_repeat 

    private 
    def set_repeat 
    self.repeat = Event.rule(date, repeat) if ['none', 'daily', 'monthly', 'yearly'].include? repeat 
    end 
end 

Это всегда будет работать метод set_repeat частного обратного вызова на Event экземпляра перед его сохранением в БД, и изменяет атрибут repeat, если он в настоящее время одна из строк в ['none', 'daily', 'monthly', 'yearly'] (но вы должны приспособить эту логику по мере необходимости - я просто догадался, чего вы захотите).

Таким образом, я бы рассмотрел ActiveRecord callbacks как общий способ изменения атрибутов модели перед их сохранением.

1

Я понял, что могу использовать обратный вызов ActiveRecords в моей модели Event. Как следует:

before_save do 
    self.repeat = Event.rule(self.date, self.repeat) 
    end 
+1

Что возвращает 'Event.repeat'? Должно ли это не быть «self.repeat»? –

+0

да спасибо) моя ошибка – Gabi

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