2011-10-21 36 views
1

當我做一個before_validation如下:attr_accessor可變零做before_validation回調

event.rb

attr_accessor :start_date 
attr_accessible :start_time #recorded in database as a datetime 

before_validation :build_start_time 

... 

def build_start_time 
    begin 
    self.start_time = DateTime.parse(start_date) 
    rescue 
     errors.add(:start_date, "invalid date") 
     return false 
    end 
end 

和控制器的樣子:

def create 
    @event = events.build(params[:event]) 
    if @event.save 
    # some other method calls 
    redirect_to @event 
    else 
    redirect_to :root 
    end 
end 

起始日期是由設置a <%= f.text_field:start_date%>在窗體視圖中調用,當我檢查參數時,它正確地傳遞給模型控制器的'Create'方法,但是我如果build_start_time方法爲零,則不會設置self.start_time。你能解釋爲什麼它是零,解決方案是什麼?我也試過將它稱爲self.start_date,但這沒有什麼區別。

感謝

回答

2

你有沒有試圖使start_date也可以訪問?

+0

是啊,就是這樣,謝謝。 – tks

1

要麼你打電話attr_accessiblestart_date所以build()實際上可以設置它,或者您可以將控制器更改爲:

def create 
    @event = events.build(params[:event]) 
    @event.start_date = params[:event][:start_date] 
    if @event.save 
    # some other method calls 
    redirect_to @event 
    else 
    redirect_to :root 
    end 
end 
0

TENTE assim。

#app/models/adm/video.rb 
class Adm::Video < ActiveRecord::Base 
    validates :titulo, :url_codigo, presence: true 
    before_validation(on: [ :create, :update ]) do 
    self.url_codigo = parse_youtube(url_codigo) #url_codigo = params[:adm_video][:url_codigo] 
    end 

    private 
    # pega só o codigo do link youtube para inserir no banco 
    def parse_youtube(url) 
    if !url.blank? 
    regex = /(?:.be\/|\/watch\?v=|\/(?=p\/))([\w\/\-]+)/ 
    return url.match(regex)[1] # https://www.youtube.com/watch?v=iX_rKHnKJSg = iX_rKHnKJSg 
    end 
end 

end 

Grava酒店沒有去銀行所以dados做código視頻= iX_rKHnKJSg = https://www.youtube.com/watch?v=iX_rKHnKJSg = iX_rKHnKJSg。

記錄在數據庫中,以便代碼iX_rKHnKJSg視頻=#= https://www.youtube.com/watch?v=iX_rKHnKJSg iX_rKHnKJSg

+0

嗨,歡迎來到堆棧溢出。這可能很好地解決了這個問題......但是如果你能夠提供關於它是如何工作和爲什麼工作的一點解釋,那麼它會很好:)你可能沒有意識到它,但是堆棧溢出中有許多新手,他們可以學習從你的專業知識中得到一兩件事 - 對你來說顯而易見的事情對他們來說可能並非如此。 –