查看此代碼:
params[:id]
引數被認為是一種方法。如果我錯了,請糾正我。但這就像從哈希中讀取。所以,我目前很困惑。
如果 params 是一種方法:顯示的代碼示例如何作業?
uj5u.com熱心網友回復:
你是對的,這params是一個方法,但這里的params方法回傳一個實體,ActionController::Parameters我們#[]在它上面呼叫哈希訪問器方法。
這是 ruby?? 中呼叫回傳物件方法的常見模式。讓我們通過一個簡單的例子來看看它:
def params
{
id: 101,
key: 'value',
foo: 'bar'
}
end
params[:id] # => 101
params[:foo] # => 'bar'
正如您在示例中看到的,方法params回傳一個散列物件,我們#[]在回傳的物件上呼叫散列訪問器方法。
參考railsparams方法:https : //github.com/rails/rails/blob/5e1a039a1dd63ab70300a1340226eab690444cea/actionpack/lib/action_controller/metal/strong_parameters.rb#L1215-L1225
def params
@_params ||= begin
context = {
controller: self.class.name,
action: action_name,
request: request,
params: request.filtered_parameters
}
Parameters.new(request.parameters, context)
end
end
ruby 初學者注意事項:在 ruby?? 中,我們可以呼叫不帶括號的方法。所以,上面的呼叫等價于params()[:id].
uj5u.com熱心網友回復:
這些被稱為方括號訪問器,您可以通過實作[]和[]=方法將它們添加到任何物件。
class Store
def initialize(**kwargs)
kwargs.each { |k,v| instance_variable_set("@#{k}", v) }
end
def [](key)
instance_variable_get("@#{key}")
end
def []=(key, value)
instance_variable_set("@#{key}", value)
end
end
store = Store.new(foo: 1, bar: 2, baz: 3)
store[:foo] # 1
store[:foo] = 100
store[:foo] # 100
此外,當您呼叫時params[:id]- 該params方法將首先被呼叫,因此您正在呼叫[]ActionController::Parameters 的實體,就像在這個簡單的示例中一樣:
def foo
Store.new(bar: 1)
end
foo[:bar] # 1
由于括號是可選的,因此相當于呼叫params()[:id].
uj5u.com熱心網友回復:
在控制器的背景關系中,params確實是一種方法。假設我們有一個OrganizationsController將#index動作暴露在一個寧靜的端點中。我將使用pry gem添加一個斷點,以便我們可以更好地理解是什么params:
class OrganizationsController < ApplicationController
def index
binding.pry # Runtime will stop here
render json: Organization.all
end
end
讓我們訪問以下 URL:
http://localhost:3000/organizations.json?foo=bar
我們實際上可以params通過顯式呼叫它來驗證它是一個方法():
> params()
=> #<ActionController::Parameters {"foo"=>"bar", "controller"=>"organizations", "action"=>"index", "format"=>"json"} permitted: false>
或者通過實際詢問 Ruby 在哪里定義該方法:
> method(:params).source_location
=> ["/home/myuser/.rvm/gems/ruby-3.0.2@myproject/gems/actionpack-6.1.4.1/lib/action_controller/metal/strong_parameters.rb", 1186]
呼叫回傳的物件params不是 a Hash,而是 an ActionController::Parameters:
> params.class
=> ActionController::Parameters
但是,我們可以對其呼叫方法:[],因為它實際上是在ActionController::Parameters類中定義的(參見代碼)
這使它看起來實際上是一個Hash,但實際上不是。例如,我們不能呼叫invert onHash方法,因為它沒有定義:params
> params.invert
NoMethodError: undefined method `invert' for #<ActionController::Parameters {"foo"=>"bar", "controller"=>"organizations", "action"=>"index", "format"=>"json"} permitted: false>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314947.html
