0

送信されたリンクのog:imageタグから写真を検索するメソッドがアプリケーションにあります。作成アクションでは、photo_form_url以下に説明するメソッドを使用します。

def photo_from_url(url)
  if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
    photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
    self.photo = URI.parse(photo_url)
    self.save
  end 
end

ただし、これにより、不正なURLが入力された場合にエラーが発生します。私は以下のように救助しようとしましたが、これは私に「未定義のメソッドredirect_to」を与えます

def photo_from_url(url)
  begin
    if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
      photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
      self.photo = URI.parse(photo_url)
      self.save
    end
  rescue OpenURI::HTTPError
    redirect_to :back, notice: 'link's broken!'
  end
end

私は何が間違っているのですか?

4

1 に答える 1

2

私のコメントに対するあなたの答えによると、あなたの関数photo_from_urlはモデルで定義されています。直面しているエラーが示すように、モデル内でユーザーをリダイレクトしようとすることはできません。

モデルはブラウジングセッション環境の外部で呼び出すことができることに注意してください。例えば:

  • テスト
  • レーキタスク

したがって、ユーザーブラウザの操作やモデル内のユーザーセッションに関係するコードを絶対に配置しないでください。これがコントローラーの仕事です。

したがって、必要なのは、不正なURLに遭遇したときに、単に例外を発生させるか、モデルで特定の値を返すことです。そして、ユーザーをリダイレクトすることにより、コントローラーのその例外/戻り値に対応します。これにより、ユーザーブラウザーに関係するすべてのものがコントローラーに残り、同じエラーが発生した場合にrakeタスクで異なる動作を実装できるようになります。

したがって、モデルは何かを実行し、実行できない場合はエラーを発生させる必要があります。

# Link.rb
def photo_from_url(url)
  if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
    photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
    self.photo = URI.parse(photo_url)
    self.save
  end 
end

コントローラーはモデルに何かをするように依頼し、問題がある場合はユーザーに対処する必要があります。

# link_controller
# in create
begin
  link.photo_from_url(url)
rescue OpenURI::HTTPError
   redirect_to :back, notice: 'link's broken!'
end
于 2013-03-11T18:27:09.767 に答える