Получение рельсов "params" без значений по умолчанию? - PullRequest
24 голосов
/ 19 сентября 2011

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

Я согласился на:

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

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

Ответы [ 5 ]

41 голосов
/ 19 сентября 2011

Вы можете использовать, кроме:

params.except(:action, :controller)

http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html

22 голосов
/ 08 июля 2014
request.path_parameters

возвращает path_parameters

request.query_parameters

возвращает параметры запроса

Вы ищете последнее.

21 голосов
/ 04 октября 2012

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

Короче говоря, рельсы и стойки готовят входящие запросы 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)
4 голосов
/ 19 июня 2014

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

request.request_parameters

исключает параметры пути (контроллер и действие)

1 голос
/ 12 сентября 2016

Я использую

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: 'test@example.com', password: 'password123'}

Вывод на консоль будет:

{"email"=>"test@example.com", "password"=>"password123", "session"=>{"email"=>"test@example.com", "password"=>"password123"}}

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

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