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

Получение параметров "рельсов" без дефолтов?

Есть ли в рельсах опрятный способ получить хэш из параметров без стандартных действий "action" и "controller"? По существу без каких-либо параметров, которые не были добавлены мной.

Я решил:

parm = params.clone
parm.delete('action')
parm.delete('controller');

Но интересно, есть ли более простой способ сделать это?

4b9b3361

Ответ 2

Если вы работаете в контроллере, вы также должны иметь доступ к объекту запроса.

Чтобы сделать длинную историю короткими, рельсы и стойки groom поступают в GET/POST-запросы (form, xml, json) и вытаскивают параметры, чтобы разработчики имели последовательный способ доступа к ним.

ActionDispatch предоставляет сводный список параметров с помощью:

# ActionPack 3.1.8 - action_dispatch/http/parameters.rb
# Returns both GET and POST \parameters in a single hash.
def parameters
  @env["action_dispatch.request.parameters"] ||= begin
    params = request_parameters.merge(query_parameters)
    params.merge!(path_parameters)
    encode_params(params).with_indifferent_access
  end
end
alias :params :parameters

Как вы можете видеть, params - это псевдоним для метода параметров, который представляет собой объединенный хеш двух суб-хэшей: request_parameters и path_parameters.

В вашем случае вам не нужны параметры path_parameters. Вместо того, чтобы использовать исключение, которое заставляет вас знать, какие параметры пути вы хотите исключить, вы можете получить доступ к своим данным через: request.request_parameters.

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

encode_params(params).with_indifferent_access

Альтернативный подход, использующий исключение и гарантирующий, что вы удалите все параметры запроса без запроса:

path_params = request.path_parameters
params.except(*path_params.keys)

Ответ 3

request.path_parameters

возвращает path_parameters

request.query_parameters

возвращает request_parameters

Вы ищете его.

Ответ 4

использование

request.request_parameters

он исключает path_parameters (контроллер и действие)

Ответ 5

Я использую

request.request_parameters.except(controller_name.singularize)

Это удаляет вложенный объект, названный в честь активного контроллера. Например, со следующим контроллером:

Class SessionController > ActionController::Base
  def create       
   User.find_by(params[:email]).login(password: params[:password])
   puts request.request_parameters
  end
end

Со следующим опубликованным значением из веб-формы:

{email: '[email protected]', password: 'password123'}

Выход консоли будет:

{"email"=>"[email protected]", "password"=>"password123", "session"=>{"email"=>"[email protected]", "password"=>"password123"}}

Вышеуказанные строки кода избегают этого.