Установка глобальной переменной на основе значения в params в Rails - PullRequest
0 голосов
/ 29 октября 2019
Rails 5.2

Я хотел бы установить глобальную переменную, доступную для всех контроллеров. Это будет установлено, основываясь на значении одного из параметров. Я попытался сделать это:

controllers/application_controller.rb

before_action :set_book_author

def set_book_author 
  @book_author = params[:book_author] if params.has_key?(:book_author)
end

Но так как остальной вызов идет в / book_authors /: book_author, application_controller.rb, не видит его первым.

Есть ли способ сделатьthis?

Пример того, как я понимаю сессию как ненадежную:

class Location
  def initialize(ip)
    @location = location_request(ip)  
  end
end

class ApplicationController < ActionController::Base
  before_action :set_location

  def set_location(user_ip)
    session[:user_location] = Location.new(user_ip)
  end
end

Как только я перестал использовать Location, приложение вызовет исключение, если я попытаюсь использовать session[: USER_LOCATION]

1 Ответ

1 голос
/ 29 октября 2019

На самом деле ваш код выглядит так, как будто он должен работать нормально, но убедитесь, что все ваши затронутые контроллеры наследуют от ApplicationController (это значение по умолчанию в генераторе, но проверьте, чтобы быть на безопасной стороне), а имя параметра - это то, что вы предоставилии одинаково во всех затронутых действиях (вложенные рельсы resources будут производить book_author_id, а не book_author).

Другая мысль - вам может не потребоваться извлекать данные из params для каждого действия каждого контроллера(потому что позже вы можете захотеть сделать там запрос БД или что-то подобное), поэтому лучше иметь вспомогательный метод с памяткой (он будет доступен как из контроллера, так и из представлений):

class ApplicationController < ActionController::Base

  helper_method def book_author
    raise("No book author in params (change this to `return` once confirmed ok)") unless params.has_key?(:book_author)

    @book_author ||= begin
      # here goes the fetching code, that returns result:
      params[:book_author]
    end
  end

end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...