0

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

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

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

我需要它填写表单的部分作为它自己的方法,因为它需要作为后台作业运行,并且出于我的目的,将用户信息作为此后台作业的一部分发送几乎没有意义。

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

那么,我怎样才能让相同的 Mechanize 代理遵循该fillform方法呢?如果您需要更多信息,请告诉我。(我承认我是这方面的新手,所以我对使用 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
4

1 回答 1

0

终于想通了,这在一定程度上得到了亚当在这里的回答的帮助。

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

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

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

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

现在机械化进入块,块因此正确执行。

于 2013-08-26T18:11:49.503 回答