我正在使用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
答案 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跟随到块中,然后块正确执行。