我在我的应用程序中使用 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