url_for дает другой вывод в консоли и контроллере - Rails 5

Я пытаюсь разрешить моему приложению Rails 5 твитить каждый раз, когда создается новый плагин с помощью sferik/twitter gem. В твите я хотел бы опубликовать 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 Console, он выводит правильную ссылку.

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"

Почему вывод в моем контроллере и консоли не совпадает?


person Ernest Mistiaen    schedule 03.12.2019    source источник


Ответы (1)


Похоже, в вашем контроллере вы еще не сохранили плагин. Это означает, что у него нет идентификатора, и поэтому рельсы не могут полностью сгенерировать URL-адрес.

build создает новый объект плагина с параметрами, но не сохраняет его. Вам нужно либо добавить @plugin.save или @plugin.save!, чтобы сохранить его, либо вы можете использовать current_user.plugins.create(plugin_params).

Я ожидаю, что в вашей консоли вы создаете или загружаете плагин по-разному, поэтому вы видите другое поведение.

Возможно, было бы полезнее дать вам сообщение об ошибке в этот момент, но технически это это URL-адрес, по которому вы также должны опубликовать новый плагин, и, я думаю, именно поэтому он ведет себя так.

person Shadwell    schedule 03.12.2019
comment
Привет, я изменил его на current_user.plugins.create(plugin_params), и это сработало, большое спасибо! - person Ernest Mistiaen; 03.12.2019