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