2012-01-30 6 views
1

ユーザーに代わってコメントを投稿できるRubyアプリケーションをリモートブログに書き込む。私の問題は、私はキャプチャを記入する&セッションを存続するために、コントローラのPOSTメソッドで同じページを使用する必要があることです。機械化ページオーバーリクエストの境界を維持する

アプリ/コントローラ/ comment_controller.rb

require 'mechanize' 
class CommentController < ApplicationController 
    def new 
     agent = Mechanize.new 
     @page = agent.get('http://blog.example.com') 
     @captcha_src = @page.search("//div[@id='recaptcha_image']").search("//img")[1].attribute("src") 
     #etc. 
    end 

    def post_comment 
     # insert captcha, username, password + text into the form 
     agent.submit(@page.form[0], @page.form[0].buttons.submitbutton) # Problem: page instance variable doesn't exist anymore 
    end 
end 

私はすでにRails.cacheにpage-instance-variableを保存しようとしましたが、機械化されたページを文字列にマーシャリングすることはできません。

+0

これはレールコントローラですか?なぜあなたは@pageがリクエストの間に持続すると思いますか?それともエージェントですか? 「新しい」方法を持つことは良い考えのようですか?私はあなたがルビーやレールの基本的な理解を欠いていると思います。 – pguardiario

+0

@pguardiario:リクエストの間に '@page'が続くとは思わないが、問題の中核となるagent.submit line-commentを見てください。 new-Methodは、生成されたレール(足場)です。 – wintersolutions

答えて

0

私は実際の解決策を書いています。隠し変数とクッキーを、隠されたフィールドのリクエスト間で転送するbase64でエンコードされた文字列に保存します。

require 'mechanize' 
require 'stringio' 
require 'base64' 

class MechanizeWrapper 
    attr_reader :page, :agent 

    def initialize(url, useproxy = true) 
    @agent = Mechanize.new 
    @page = @agent.get(url) 
    end 

    def get_state() 
    hidden_fields = {} 
    cookie_jar = StringIO.new 

    @page.search("//input[@type='hidden']").each do |hidden| 
     hidden_fields[hidden.path]=hidden.attribute('value').to_s 
    end 

    @agent.cookie_jar.dump_cookiestxt(cookie_jar); 

    state = {:hidden_fields => hidden_fields.inspect, :cookie_jar => cookie_jar.string} 
    Base64.encode64(state.inspect) 
    end 

    def put_state(state_enc) 
    state = eval(Base64.decode64(state_enc)) 
    eval(state[:hidden_fields]).each do |path,value| 
     @page.search(path).first['value'] = value 
    end  

    cookie_jar = StringIO.new(state[:cookie_jar]) 
    @agent.cookie_jar.load_cookiestxt(cookie_jar) 
    end 
end 
関連する問題