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

url_for gives different output in console versus controller - Rails 5

每当使用 sferik/twitter gem 创建新插件时,我都会尝试让我的 Rails 5 应用发推文。在推文中,我想 post url 到新插件。所以在我的控制器中我添加了以下内容:

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) 没有为新插件生成准确的 link。它在我的推文中输出 http://localhost:3000/plugins 应该输出 http://localhost:3000/plugins/does-this-work.

当我在 Rails 控制台中尝试相同时,它确实输出了正确的 link。

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).

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

可以说,在那个时候给你一个错误会更有帮助,但从技术上讲, url,你会 POST 一个新插件我认为这也是它表现如此的原因。