Как установить config.action_controller.default_url_options = {:host = '#''} для каждой среды

Прямо сейчас я использую это, которое работает для хоста разработки, но я должен вручную изменить код {:host => ""}, когда я перехожу к производству.

post.rb

def share_all
  url =  Rails.application.routes.url_helpers.post_url(self, :host => 'localhost:3000')
  if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(url)  
  end
end

Я хотел бы использовать это, а затем определить default_url_options для среды:

post.rb

def share_all
  url =  Rails.application.routes.url_helpers.post_url(self)
  if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(url)  
  end
end

Я пытался добавить это в свой config/environment /development.rb, но все равно получаю сообщение об ошибке "Отсутствует хост для ссылки! Пожалуйста, предоставьте: параметр host или установите default_url_options[:host]"

development.rb

config.action_controller.default_url_options = {:host => "localhost:3000"}

И я даже попробовал это так:

development.rb

config.action_controller.default_url_options = {:host => "localhost", :port => "3000"}

РЕДАКТИРОВАТЬ:

Теперь я также следовал этому и тому же руководству по ошибкам http://edgeguides.rubyonrails.org/action_controller_overview.html

контроллер приложений

class ApplicationController < ActionController::Base
  protect_from_forgery
  include ApplicationHelper
  def default_url_options
    if Rails.env.production?
      { :host => "example.com"}
    else
      {:host => "example1.com"}
    end
  end
end

Это сводит меня с ума, чего мне здесь не хватает???

9 ответов

Решение

Хорошо, я понял, как правильно написать это

Rails.application.routes.default_url_options[:host] = 'localhost:3000'

:)

Унаследовать ваше приложение default_url_options от ActionMailer,

Вы хотите, чтобы все было как можно более сухим, поэтому в идеале не нужно жестко кодировать хост и порт в нескольких местах для одной и той же среды, если только ActionMailer на самом деле использует другой хост и порт, чем остальные Application,

Чтобы установить default_url_options для всего вашего Applicationпросто добавьте следующую строку в ваш config/environment.rb файл (меняется MyApp на имя вашего приложения):

# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

Это решит вашу проблему и автоматически установит ваш Application"s default_url_options так же, как ваш config.action_mailer.default_url_options:

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

Вы должны перезагрузить сервер, чтобы изменения в этом файле вступили в силу.

config/environment / development.rb (любая другая среда, такая же)

добавьте эту строку с хостом, который вы хотите

routes.default_url_options[:host] = 'localhost:3000'

config.action_mailer.default_url_options = {:host => "ваш хост" }

например ваш хост localhost:3000

Вы можете поместить это в файлы test.rb, development.rb, production.rb, которые могут отличаться от среды к среде

Вот как я обычно решаю эту проблему:

Во-первых, правильно настроитьconfig/environments/production.rb(и другие среды) изrails newавтоматически сгенерированный файл:

      Rails.application.configure do
  # [...]
  config.action_mailer.default_url_options = {
    host: "https://your_app.your_domain.tld"
  } # You may also use an env variable ENV['HOST'] if necessary
end

Затем вернитесь к своемуconfig/application.rbи установите наследование от этой конфигурации ActionMailer:

      require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)

module YourModule
  class Application < Rails::Application
    # [...]
    config.after_initialize do |app|
      app.routes.default_url_options = app.config.action_mailer.default_url_options
    end
  end
end

Я просто столкнулся с этой проблемой, пытаясь сгенерировать URL-адрес в задаче rake. Это определенно неочевидно, и многие из этих решений будут работать. Мое решение взято из @joshua-pinter, но сделано в файле среды. Например мой development.rb выглядит как:

      Rails.application.configure do
  …
  config.action_mailer.default_url_options = self.default_url_options = { host: 'localhost', port: 3000 }
  …
end

с соответствующими изменениями, внесенными в production.rb.

Я знаю, что это старый поток, но я столкнулся с ним с Ruby 2.6.3 и Rails 5.2.3. Поведение, которое я наблюдал, заключалось в том, что каждый добавленный мной путь терпел неудачу сError during failsafe response: undefined method 'empty?' for nil:NilClass. В производственной среде он работал нормально, но в моей среде разработки я получал указанную выше ошибку.


Исправление для меня было добавить это в controllers/application_controller.rb:

def default_url_options
  if Rails.env.production?
    Rails.application.routes.default_url_options = { host: "www.production-domain.com", protocol: 'https' }
  elsif Rails.env.development?
    Rails.application.routes.default_url_options = { host: 'localhost:3000', protocol: 'http' }
  end
end

Затем я смог запустить свою среду разработки на своем локальном компьютере.

Для меня сработало то, что

ActionMailer::Base.default_url_options = { host: "yourhosthere"} # e.g. yourhosthere=localhost:3000 or yourhosthere=example.com

потому что если вы уже установили порт в файлах конфигурации, то изменение только [:host] приведет к ошибке

TypeError (no implicit conversion of Symbol into Integer):
Другие вопросы по тегам