[英]Getting the rails 'params' without the defaults?
在rails中是否有一種巧妙的方法來獲取params的哈希,而沒有默認的'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
request.path_parameters
返回path_parameters
request.query_parameters
返回request_parameters
你正在尋找后者。
如果您在控制器中工作,則還應該有權訪問請求對象。
總而言之,rails和rack修改傳入的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訪問數據,而不是使用except來強制您知道要排除哪些路徑參數。
需要注意的一點是 :您可能最好使用:除非您需要對哈希進行編碼並將密鑰作為字符串或符號進行訪問。 參數方法的最后一行為您處理:
encode_params(params).with_indifferent_access
使用except並確保刪除所有rails非請求參數的替代方法:
path_params = request.path_parameters
params.except(*path_params.keys)
采用
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
使用以下Web表單的發布值:
{email: 'test@example.com', password: 'password123'}
控制台輸出將是:
{"email"=>"test@example.com", "password"=>"password123", "session"=>{"email"=>"test@example.com", "password"=>"password123"}}
上面的代碼行避免了這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.