2011-01-11 68 views
1

嘿所有,我有驗證問題,我一直在努力在過去幾天沒有運氣。我擁有的是我有一個需要用戶輸入URL的模型。我已經在我的模型下面的做到了這一點:Rails 3 - 表單驗證 - 將邏輯移至回調或觀察者?

validates :url, :presence => true 

當用戶提交他們的形式,我把他們的網址,並引入nokogiri打開它拉基本的東西,如網頁標題。我目前正在使用控制器中的Create方法執行此操作。代碼看起來像這樣:

def create 
    require 'open-uri' 
    @page = Page.new(params[:page]) 

doc = Nokogiri::HTML(open(@page.url)) 

我在跑的問題是,如果用戶輸入一個空白表格,引入nokogiri會報錯了,因爲它運行,儘管我試圖驗證表單。

我的問題是,我應該把這種邏輯轉移到回調還是觀察者?我很新的軌道,但有沒有辦法讓我從一個回調/觀察員的數據/實例變量?我沒有簡單地使用@page,但想知道是否有一種方法我應該把它傳遞給回調/觀察者,如果這是這種邏輯應該放置的地方?

謝謝

回答

3

最好把它放在模型中。

控制器方法確實像

def create 
    @page = Page.new(params[:page]) 
    respond_with @page 
end 

,並在模型中你有

class Page < ActiveRecord::Base 
    ... 
    before_save :pull_info_from_url 

    def pull_info_from_url 
    doc = Nokogiri::HTML(open(self.url)) 
    ... 
    end 
end 

before_save回調驗證後運行,所以如果存在檢查失敗,此代碼不得到執行,並顯示帶有錯誤的表單。

+0

嘿,感謝您的幫助。它現在像一個魅力。我還有一個關於回調的問題,在閱讀一些文檔時我找不到。有沒有辦法只能在create方法之後運行這個before_save回調?按照它的規定,它在更新之後運行,並且在它保存之前。我需要隔離它,所以它只是在創建之後,因此我最初在控制器上擁有該方法中的邏輯。 – Kombo 2011-01-12 19:11:24