从控制器使用Mechanize代理遵循模型方法

时间:2013-08-23 03:49:09

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 mechanize

我正在使用Mechanize和我的应用程序,并且在我的控制器的show操作中,我需要包含后台作业方法(fillform)。

基本上,应用程序使用输入的用户名和密码(来自一个user对象)登录外部网站,然后使用该用户的其他输入信息(所有order)填写许多表单对象)。

然后我销毁该用户的信息(为了更好的衡量,我实际上只是销毁所有用户信息,因为一旦发送后台作业请求,就不需要存储在数据库中。)

我需要这个部分,它填写表单作为自己的方法,因为它需要作为后台作业运行,并且就我的目的而言,将用户信息作为后台作业的一部分发送是没有意义的。

问题是,一旦我将对象的表单填充移动到模型方法(fillform)调用(即,不再是show操作的一部分),Mechanize代理就失败了按照方法进行,过程失败。也就是说,它不再认识到它已登录到此网站,因此该过程失败,因为它可以访问各种内部URL的唯一方法是已经登录。即使该方法不是后台,也会发生同样的事情工作,但只是一个常规的模型方法。

那么,如何在fillform方法中使用相同的Mechanize代理?如果您需要更多信息,请与我们联系。 (我承认这是一个新手,所以我对使用MVC的理解存在一些差距。)

Order控制器中:

def show
  @orders = Order.all
  @user = User.last(params[:user])
  agent = Mechanize.new
  agent.follow_meta_refresh = true

  page = agent.get('www.myurl.com')

  myform = page.form_with(:action => '/maint')

  myuserid_field = myform.field_with(:id => "username")
  myuserid_field.value = @user.myuserid
  mypass_field = myform.field_with(:id => "password")
  mypass_field.value = @user.mypass

  page = agent.submit(myform, myform.buttons.first)

  @orders.each do |order|
    order.delay.fillforms
  end

  User.destroy_all

end

Order模型中:

def fillforms
  internal_url = 'www.myurl.com/'+ keyword.gsub(/.*;/, '') + ''
  page = agent.get("#{internal_url}")
  entry_form = page.form_with(:name => "submit")
  some code here...
  page = agent.submit(entry_form, entry_form.buttons.first)
end

1 个答案:

答案 0 :(得分:0)

最后想出了这一点,部分得益于亚当的回答here

在我的控制器的show操作中,我将块更改为:

@order.each do |order|
  order.fillforms(order.id, agent)
end

Order模型中,我将fillforms方法的前两行更改为:

def fillforms(order_id, agent)
  order = Order.find(order_id)

现在,Mechanize跟随到块中,然后块正确执行。