neounix
(Dark Matter)
2020 年4 月 29 日 14:45
44
对我来说,这看起来是个不错的开始。现在,我只需要学会如何用它做一些酷炫的事情。
我的第一个计划是编写一些代码来查询数据库,以便从 post_custom_fields 表中获取我需要的值,并将其用于主题页面,以满足我们资深版主团队提出的一个小需求。
明天我会从 Git 拉取代码,开始寻找其他插件中的示例数据库代码,以此作为起点,看看我能走多远。
再次感谢 @j.jaffeux 。
每一分努力都有帮助,而对于像我这样的 Discourse 插件新手来说,拥有这样一个生成器真的非常感激。你可以在底部看到它,仿佛在请求被开发出来:
多年来,我为 vBulletin 编写了无数插件,因此我对为 Discourse 开发一些简单的插件感到非常兴奋,请相信我。
2 个赞
neounix
(Dark Matter)
2020 年8 月 11 日 06:35
45
你好 @j.jaffeux
我仍在努力学习 Discourse 插件开发,今天又回到了这个插件生成器;我在 macOS 的开发环境中尝试了以下操作,应用运行正常,我也一直在进行大量的 Ruby 和 Rails 学习以及小型插件开发:
# cd /var/Tim/Discourse/plugins
# rails g plugin DiscourseRacoon
# bundle exec 'rails s'
一切看起来都很顺利,插件也安装成功了:
但当我访问以下路由时:
http://localhost:3000/discourse_racoon
它无法正常工作:
我是否理解有误,以为在生成基础插件(本例中为 DiscourseRacoon)后,插件路由和控制器应该开箱即用(OOTB)?
我查阅了多个在线参考资料,它们都指出我们应该检查路由是否存在;于是我查看了 routes.rb,确认其中确实定义了路由;我还检查了 discourse_racoon_controller.rb,控制器中确实包含一个 index 方法(动作)。
抱歉,我仍在努力掌握更有趣的插件开发和 Discourse 相关技术。我哪里做错了?对于下一步如何调试,有什么建议吗?
谢谢。
1 个赞
j.jaffeux
(Joffrey Jaffeux)
2020 年8 月 11 日 06:39
46
是 /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 个赞
neounix
(Dark Matter)
2020 年8 月 11 日 06:45
47
你好 @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 个赞
neounix
(Dark Matter)
2020 年8 月 12 日 04:27
48
你好,
我用这个生成器创建了一个“Hello World”插件,添加了一些 Ruby 的“写入文件”语句,并观察了 Rails 的生命周期。结果发现 Rails 控制器未按预期工作(它们没有记录日志,表明被忽略了)。
经过调试后,我将 Rails 控制器向上移动了一级目录,问题便解决了。
此外,我还为首页添加了 JavaScript/Ember 控制器和模板,为所有模板添加了一些 HTML 和 CSS,并编写了一些 JavaScript 代码来读取 Cookie 并高亮显示模板。
例如,在对 Rails 插件生成器生成的插件进行几次修改后:
http://localhost:3000/hello-world/
完整详情和截图请参阅:
Discourse
Discourse Plugins
Discourse has a rails plugin generator which generates a basic Discourse plugin scaffolding. So, I created a "hello world" plugin with this generator using rails g plugin hello-world and added a bunch of Ruby statements to each .rb file to...
Reading time: 2 mins 🕑
Likes: 2 ❤
最后,我要感谢 @j.jaffeux 提供的这个 Rails 插件生成器。我在调试 Rails 控制器的过程中玩得很开心,并乐于修改它以提供更多代码,以便同时检查 Rails 生命周期和 JS 模板/控制器。
希望我的修改能帮助到像我一样,在业余时间学习 Discourse 插件开发基础并希望使用 Rails 插件生成器的其他人。
另请参阅:
A plugin for debugging the Discourse rails plugin generator
目前,我正在享受调试和修复损坏插件的过程,这也是我学习 Rails 和 Discourse 插件开发的一部分
5 个赞
pfaffman
(Jay Pfaffman)
2020 年8 月 12 日 19:45
49
谢谢你解决了这个问题,@neounix !这或许正是我推动项目前进所需的助力。
嘿,@j.jaffeux ,移动这些文件是推荐的解决方案吗?还是应该通过类似下面的方式将它们包含进来:
load File.expand_path('some-path-here', __dir__)
我记得 我试过包含它们,但随后出现了某个错误,提示缺少……某个东西(所以我猜我操作不当,不值得专门记录具体细节)。
编辑:看起来控制器在访问 /plugin-path 时确实会被加载并执行。
3 个赞
neounix
(Dark Matter)
2020 年8 月 13 日 00:25
50
嘿 @pfaffman
我最初尝试在 plugin.rb 中使用 load 语句加载 Ruby 控制器,但它们没有按预期记录日志。
在测试 Ruby 控制器时,我使用 Ruby 语句将日志写入文件系统,并对该日志文件运行 tail -f 来测试控制器的触发情况。
为了好玩,我昨天结束时写了一些代码,通过 Rails 控制器将所有进程环境变量(ENV)读取到 cookie 中,并通过 Ember 控制器将它们写入应用。
真的很有趣!
我上瘾了 哈哈
3 个赞
riking
(Kane York)
2020 年9 月 10 日 00:58
51
neounix:
我猜这是 Rails 的一个约定,我需要学习吗?即所有用下划线定义的路由都是通过连字符访问的?
DiscourseRacoon::Engine.routes.draw do
get "/" => "discourse_racoon#index", constraints: DiscourseRacoonConstraint.new
URL 部分位于左侧,Ruby 代码引用位于 => 的右侧。_ 与 - 的区别是在引擎的 mount 行中定义的。
4 个赞
在 @eviltrout 的插件指南第 4 部分 中,他建议在 Discourse 代码库之外开发插件,并在 plugins 目录中设置符号链接。
是否可以考虑添加一个 -d ~/path/to/plugin_src 选项,以便在另一个目录中生成插件,并可能同时设置符号链接?
1 个赞
j.jaffeux
(Joffrey Jaffeux)
2021 年8 月 20 日 08:38
53
抱歉,我可能会暂时弃用此内容并关闭该话题。
虽然自定义功能稍弱,但我们目前推荐启动插件的方式是使用 GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub 作为模板(请查看绿色的“使用此模板”按钮)。
这样我们更容易保持其更新。
6 个赞