我在我的应用程序中使用机械化,在我的控制器的show
操作中,我需要包括一个后台作业方法(fillform
)。
本质上,应用程序使用输入的用户名和密码(来自一个user
对象)登录到外部网站,然后使用用户的其他输入信息(所有order
对象)填写许多表单。
然后我销毁该用户的信息(为了更好的衡量,我实际上只销毁了所有用户信息,因为一旦发送后台作业请求,就不需要将任何信息存储在数据库中)。
我需要这部分,它填写表单作为自己的方法,因为它需要作为后台作业运行,就我的目的而言,发送用户信息作为这个后台作业的一部分是没有意义的。
问题是,一旦我将对象的表单填充移动到模型方法(fillform
)调用(即不再是show
操作的一部分),机械化代理就无法进入该方法,而流程就失败了。也就是说,它不再承认它是被登录到这个网站上的,因此这个过程失败了,因为它访问各种内部URL的唯一方法就是已经被登录了。即使方法不是背景作业,而是常规的模型方法,也会发生同样的情况。
那么,我如何才能获得相同的机械化代理来遵循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
发布于 2013-08-26 10:11:49
最后,亚当的回答here在一定程度上帮助了这个问题。
在控制器的show
操作中,我将块更改为:
@order.each do |order|
order.fillforms(order.id, agent)
end
在Order
模型中,我将fillforms
方法的前两行更改为:
def fillforms(order_id, agent)
order = Order.find(order_id)
现在机械化进入到块中,因此块正确地执行。
https://stackoverflow.com/questions/18394378
复制