Подтвердить что ты не робот

Как настроить 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, но я все равно получаю ссылку "Отсутствующий хост для ссылки". Предоставьте: параметр хоста или установите default_url_options [: host] "error

development.rb

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

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

development.rb

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

EDIT:

Я также следил за этим и по-прежнему одним и тем же руководством по ошибкам http://edgeguides.rubyonrails.org/action_controller_overview.html#default_url_options

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

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

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

4b9b3361

Ответ 1

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

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

:)

Ответ 2

Перед внесением изменений в этот файл необходимо перезагрузить сервер.

Ответ 3

Унаследуйте ваше приложение 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 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"}

Ответ 4

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

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

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

Ответ 5

Я знаю, что это старый поток, но я столкнулся с этим с 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

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