Как установить 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):