2011-01-11 4 views
1

こんにちは、私は最後の数日間、運がないと働いているという検証の問題があります。私が持っているのは、ユーザーにURLを入力させるモデルがあるということです。私は私のモデルでは、以下でこれをやった:Rails 3 - フォームの検証 - ロジックをコールバックまたはオブザーバに移動する

validates :url, :presence => true 

ユーザーがフォームを送信すると、私は彼らのURLを取得し、Webページのタイトルのような基本的な事柄を引っ張って鋸山で開きます。私は現在、コントローラのCreateメソッドでこれを行っています。コードはそのようになっています

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

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

私はにして実行の問題は、ユーザーが空白のフォームを入力した場合、それは私がフォームを検証しようとしたにも関わらず、実行時に、鋸山が出てエラーになりますということです。

私の質問は、この種のロジックをコールバックまたはオブザーバーに移すべきかどうかです。私はかなりレールに新しいですが、コールバック/オブザーバからデータ/インスタンス変数で作業する方法がありますか?私は単純に@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

お世話になりました。今は魅力のように働いています。いくつかのドキュメントを読んでいるうちに見つけられなかったコールバックについて別の質問がありました。 before_saveコールバックはcreateメソッドの後で実行する方法はありますか?それは、それが保存される前に更新後も実行されています。私はそれを分離する必要があるので、それは作成の後でしかないので、なぜ私はもともとコントローラー上でそのメソッドのロジックを持っていたのです。 – Kombo

+0

pull_info_from_urlの先頭に「new_recordがなければ返す」と言うことができます。私はこれを達成すると信じています。または、before_saveの代わりにbefore_createを使用することもできます。 http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacksには、コールバックと検証に関する詳細があります。 – PerfectlyNormal

関連する問題