ruby-on-rails-3 - 轨道 3 : Choose and run a Mechanize script from inside Rails action.

标签 ruby-on-rails-3 mechanize

我的应用程序使用 Mechanize 从各个站点抓取信息。当然,每个站点都需要自定义 Mechanize 代码。每个站点都存储在我的数据库中,包括要抓取的 url 和包含该站点 Mechanize 代码的 .rb 文件的字符串名称。对于本例,我们假设脚本在 Assets 文件夹中可用。

我想调用http://example.com/site/:id,然后让显示操作动态选择要运行的 Mechanize 脚本(例如,@site.name +“.rb”)。该脚本会将数据整理为通用模型,因此所有站点都可以使用相同的显示模板。

我找不到在操作中动态加载 .rb 脚本并获取结果的方法。让脚本返回 JSON 字符串可能更容易,我可以在传递到模板之前对其进行解析,但我也看不到解决方案。理想情况下,脚本将在操作的范围内运行。丑陋的解决方案是一个巨大的 if-else 链(测试站点名称以确定要运行哪个代码块),但必须有更好的方法。

任何建议都将不胜感激,就像任何根据数据库对象的属性运行不同代码的通用解决方案一样。

最佳答案

如果您的应用程序中已经有了所有代码,为什么还要评估 Ruby 代码?

创建如下类:

class GoogleSpider < Spider; end
class NewYorkTimesSpider < Spider; end
class SomeOtherSpider < Spider; end

站点类将保存将要使用的类名,因此您可以在 Controller 操作中轻松执行类似的操作:

def show
  @site = Site.find(params[:id])
  # name contains SomeOtherSpider
  @process_output = @site.name.constantize.new.process
  # do something with the output here
end

然后您无需费力评估 Ruby 代码,只需调用所需的类即可。您甚至可以将它们全部设置为单例,或者将它们全部保存在哈希中以便更快地访问。

关于ruby-on-rails-3 - 轨道 3 : Choose and run a Mechanize script from inside Rails action.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111560/

相关文章:

ruby-on-rails - ApplicationController 中的 Authlogic、Namespace 和私有(private)方法

ruby-on-rails-3 - rails 3 activerecord order - 什么是正确的sql注入(inject)工作?

ruby-on-rails - Ruby on Rails - 如何委托(delegate)给多态关联?

python - Python中的 Mechanize 有什么替代品吗?

html - Ruby Mechanize - 如何在 Mechanize 解析站点响​​应之前解析它?

Perl 通过 DOM 查找 Web 链接

python - 用 Python Mechanize 模块填充文本区域

ruby-on-rails-3 - rspec 中的 `puts response` 堆栈级别太深

javascript - 如何在 Rails 中制作动态下拉菜单?

ruby - 如何使用 Ruby 和 Mechanize 获取验证码 img src?