Ответ 1
Вы можете использовать, кроме:
params.except(:action, :controller)
http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html
Есть ли в рельсах опрятный способ получить хэш из параметров без стандартных действий "action" и "controller"? По существу без каких-либо параметров, которые не были добавлены мной.
Я решил:
parm = params.clone
parm.delete('action')
parm.delete('controller');
Но интересно, есть ли более простой способ сделать это?
Вы можете использовать, кроме:
params.except(:action, :controller)
http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Except.html
Если вы работаете в контроллере, вы также должны иметь доступ к объекту запроса.
Чтобы сделать длинную историю короткими, рельсы и стойки 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)
request.path_parameters
возвращает path_parameters
request.query_parameters
возвращает request_parameters
Вы ищете его.
использование
request.request_parameters
он исключает path_parameters (контроллер и действие)
Я использую
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"}}
Вышеуказанные строки кода избегают этого.