簡體   English   中英

在沒有默認值的情況下獲取rails'params'?

[英]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_parameterspath_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM