url_for在控制台和控制器中给出不同的输出 - Rails 5



每当使用 sferik/Twitter gem 创建新插件时,我都会尝试让我的 Rails 5 应用程序发推文。在推文中,我想发布新插件的网址。因此,在我的控制器中,我添加了以下内容:

class PluginsController < ApplicationController
include Rails.application.routes.url_helpers
def create
@plugin = current_user.plugins.build(plugin_params)
$client.update("#{url_for(@plugin)}")
end
end

我用client.update发送推文。不过,我正在运行的是url_for(@plugin)没有生成指向新插件的准确链接。它在我的推文中输出http://localhost:3000/plugins,它应该输出http://localhost:3000/plugins/does-this-work

当我在 Rails 控制台中尝试相同的操作时,它确实会输出正确的链接。

2.5.7 :009 > include Rails.application.routes.url_helpers
=> Object
2.5.7 :010 > url_for(@plugin)
=> "http://localhost:3000/plugins/does-this-work"

为什么我的控制器和控制台中的输出不一样?

看起来,在您的控制器中,您实际上还没有保存插件。这意味着它没有 id,因此 rails 无法完全生成 url。

build创建一个带有参数的新插件对象,但它不会保存它。您需要添加@plugin.save@plugin.save!来保存它,也可以使用current_user.plugins.create(plugin_params)

我希望在您的控制台中,您以不同的方式创建或获取插件,这就是您看到不同行为的原因。

可以说,在这一点上给你一个错误会更有帮助,但从技术上讲,这也是你发布一个新插件的网址,我认为这就是为什么它表现得那样。

最新更新