Rails 插件生成器

对我来说,这看起来是个不错的开始。现在,我只需要学会如何用它做一些酷炫的事情。

我的第一个计划是编写一些代码来查询数据库,以便从 post_custom_fields 表中获取我需要的值,并将其用于主题页面,以满足我们资深版主团队提出的一个小需求。

明天我会从 Git 拉取代码,开始寻找其他插件中的示例数据库代码,以此作为起点,看看我能走多远。

再次感谢 @j.jaffeux

每一分努力都有帮助,而对于像我这样的 Discourse 插件新手来说,拥有这样一个生成器真的非常感激。你可以在底部看到它,仿佛在请求被开发出来:

多年来,我为 vBulletin 编写了无数插件,因此我对为 Discourse 开发一些简单的插件感到非常兴奋,请相信我。

2 个赞

你好 @j.jaffeux

我仍在努力学习 Discourse 插件开发,今天又回到了这个插件生成器;我在 macOS 的开发环境中尝试了以下操作,应用运行正常,我也一直在进行大量的 Ruby 和 Rails 学习以及小型插件开发:

# cd /var/Tim/Discourse/plugins
# rails g plugin DiscourseRacoon
# bundle exec 'rails s'

一切看起来都很顺利,插件也安装成功了:

Screen Shot 2020-08-11 at 1.26.36 PM

但当我访问以下路由时:

http://localhost:3000/discourse_racoon

它无法正常工作:

我是否理解有误,以为在生成基础插件(本例中为 DiscourseRacoon)后,插件路由和控制器应该开箱即用(OOTB)?

我查阅了多个在线参考资料,它们都指出我们应该检查路由是否存在;于是我查看了 routes.rb,确认其中确实定义了路由;我还检查了 discourse_racoon_controller.rb,控制器中确实包含一个 index 方法(动作)。

抱歉,我仍在努力掌握更有趣的插件开发和 Discourse 相关技术。我哪里做错了?对于下一步如何调试,有什么建议吗?

谢谢。

1 个赞

是 /discourse-racoon,不是 /discourse_racoon

rake routes | grep racoon

                         discourse_racoon          /discourse-racoon                                                           DiscourseRacoon::Engine
        GET  /                      discourse_racoon/discourse_racoon#index
actions GET  /actions(.:format)     discourse_racoon/actions#index
        GET  /actions/:id(.:format) discourse_racoon/actions#show
5 个赞

你好 @j.jaffeux

谢谢!

就是这样。

我猜这是 Rails 的一个约定,我需要学习一下?即所有用下划线定义的路线都用连字符访问?

DiscourseRacoon::Engine.routes.draw do
  get "/" => "discourse_racoon#index", constraints: DiscourseRacoonConstraint.new
  get "/actions" => "actions#index", constraints: DiscourseRacoonConstraint.new
  get "/actions/:id" => "actions#show", constraints: DiscourseRacoonConstraint.new
end
1 个赞

你好,

我用这个生成器创建了一个“Hello World”插件,添加了一些 Ruby 的“写入文件”语句,并观察了 Rails 的生命周期。结果发现 Rails 控制器未按预期工作(它们没有记录日志,表明被忽略了)。

经过调试后,我将 Rails 控制器向上移动了一级目录,问题便解决了。

此外,我还为首页添加了 JavaScript/Ember 控制器和模板,为所有模板添加了一些 HTML 和 CSS,并编写了一些 JavaScript 代码来读取 Cookie 并高亮显示模板。

例如,在对 Rails 插件生成器生成的插件进行几次修改后:

http://localhost:3000/hello-world/

完整详情和截图请参阅:

最后,我要感谢 @j.jaffeux 提供的这个 Rails 插件生成器。我在调试 Rails 控制器的过程中玩得很开心,并乐于修改它以提供更多代码,以便同时检查 Rails 生命周期和 JS 模板/控制器。

希望我的修改能帮助到像我一样,在业余时间学习 Discourse 插件开发基础并希望使用 Rails 插件生成器的其他人。

另请参阅:

目前,我正在享受调试和修复损坏插件的过程,这也是我学习 Rails 和 Discourse 插件开发的一部分 :slight_smile:

5 个赞

谢谢你解决了这个问题,@neounix!这或许正是我推动项目前进所需的助力。

嘿,@j.jaffeux,移动这些文件是推荐的解决方案吗?还是应该通过类似下面的方式将它们包含进来:

  load File.expand_path('some-path-here', __dir__) 

记得我试过包含它们,但随后出现了某个错误,提示缺少……某个东西(所以我猜我操作不当,不值得专门记录具体细节)。

编辑:看起来控制器在访问 /plugin-path 时确实会被加载并执行。

3 个赞

@pfaffman

我最初尝试在 plugin.rb 中使用 load 语句加载 Ruby 控制器,但它们没有按预期记录日志。

在测试 Ruby 控制器时,我使用 Ruby 语句将日志写入文件系统,并对该日志文件运行 tail -f 来测试控制器的触发情况。

为了好玩,我昨天结束时写了一些代码,通过 Rails 控制器将所有进程环境变量(ENV)读取到 cookie 中,并通过 Ember 控制器将它们写入应用。

真的很有趣!

我上瘾了 哈哈

3 个赞

URL 部分位于左侧,Ruby 代码引用位于 => 的右侧。_- 的区别是在引擎的 mount 行中定义的。

4 个赞

@eviltrout 的插件指南第 4 部分 中,他建议在 Discourse 代码库之外开发插件,并在 plugins 目录中设置符号链接。

是否可以考虑添加一个 -d ~/path/to/plugin_src 选项,以便在另一个目录中生成插件,并可能同时设置符号链接?

1 个赞

抱歉,我可能会暂时弃用此内容并关闭该话题。

虽然自定义功能稍弱,但我们目前推荐启动插件的方式是使用 GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub 作为模板(请查看绿色的“使用此模板”按钮)。

这样我们更容易保持其更新。

6 个赞