所以我正在撰寫一個簡單的控制器,它將接收來自Post對我的 API 的請求的引數。我想讓事情變得更干凈和美好,所以我寫了這樣的東西:
def create
update_contact
end
def update_contact
create_token
url = URI("https://acme.api-us1.com/api/3/contacts/#{active_campaign_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request['Accept'] = 'application/json'
request['Content-Type'] = 'application/json'
request['api-token'] = API_KEY
data = { contact: { fieldValues: [{ field: '1', value: contact[:email_token] }] } }
request.body = JSON.dump(data)
response = http.request(request)
end
def create_token
active_campaign_id = params[:contact][:id].to_i
generate_token = SecureRandom.urlsafe_base64(12)
contact = Contact.find_or_initialize_by(active_campaign_id: active_campaign_id, email_token: generate_token)
contact.save!
end
但是每當我運行它時,它就會變成:
*** NameError Exception: undefined local variable or method `active_campaign_id'
同樣適用email_token
*** NameError Exception: undefined local variable or method `email_token'
現在每當我這樣做時:
def create
update_contact
end
def update_contact
active_campaign_id = params[:contact][:id].to_i
generate_token = SecureRandom.urlsafe_base64(12)
contact = Contact.find_or_initialize_by(active_campaign_id: active_campaign_id, email_token: generate_token)
contact.save!
url = URI("https://acme.api-us1.com/api/3/contacts/#{active_campaign_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request['Accept'] = 'application/json'
request['Content-Type'] = 'application/json'
request['api-token'] = API_KEY
data = { contact: { fieldValues: [{ field: '1', value: contact[:email_token] }] } }
request.body = JSON.dump(data)
response = http.request(request)
end
有用!這是為什么?如何盡可能簡潔地構建我的代碼或方法?哪些資源可以讓我了解 Rails 中的更多訪問方法?
謝謝您的幫助!
uj5u.com熱心網友回復:
如果您想保留現有的方法并使其正常作業,您可以通過進行下一次重構來實作這一點:
def create
update_contact
end
def update_contact
contact = create_contact
url = URI("https://acme.api-us1.com/api/3/contacts/#{contact.active_campaign_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request['Accept'] = 'application/json'
request['Content-Type'] = 'application/json'
request['api-token'] = API_KEY
data = { contact: { fieldValues: [{ field: '1', value: contact.email_token }] } }
request.body = JSON.dump(data)
response = http.request(request)
end
def create_contact
Contact.create_with(
email_token: SecureRandom.urlsafe_base64(12)
).find_or_create_by!(
active_campaign_id: params.dig(:contact, :id)&.to_i
)
end
并且可能您需要使用create_with方法,因為每次您嘗試Contact通過欄位對查找email_token并active_campaign_id SecureRandom.urlsafe_base64(12)生成一個新email token物件時,您總是會創建新物件而不是從資料庫中獲取它。
uj5u.com熱心網友回復:
看起來您正試圖在“update_contact”方法中訪問“active_campaign_id”和“email_token”變數,但這些變數僅在“create_token”方法中定義。嘗試在“create_token”方法中移動“update_contact”方法,以便它可以訪問這些變數。
您可以在此處找到更多資訊: https ://guides.rubyonrails.org/v6.1/action_view_overview.html#using-action-view-with-rails https://guides.rubyonrails.org/v6.1/engines。 html#using-a-controller-provided-by-the-application https://guides.rubyonrails.org/v6.1/security.html#user-management https://guides.rubyonrails.org/v6.1/ 2_3_release_notes.html#action-controller https://guides.rubyonrails.org/v6.1/active_record_multiple_databases.html#automatic-swapping-for-horizo ??ntal-sharding
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493387.html
