【问题标题】:url_for gives different output in console versus controller - Rails 5url_for 在控制台和控制器中给出不同的输出 - Rails 5
【发布时间】:2019-12-03 08:20:10
【问题描述】:

每当使用sferik/twitter gem 创建新插件时,我都会尝试让我的 Rails 5 应用发推文。在推文中,我想将 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) 没有生成指向新插件的准确链接。它在我的推文中输出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"

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

【问题讨论】:

    标签: ruby-on-rails url rails-console url-for


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨,我把它改成了current_user.plugins.create(plugin_params),它成功了,非常感谢!
    最近更新 更多