Ruby 如何使用 yield 调用 class setter

Ruby how to call a class setter with yield

我能够让我的代码正常工作,但我不喜欢它在语法上的工作方式 - 不确定这是否是一个词。

我目前的代码:

user.set_phone(phone) do
  message = "Verify your phone number #{@host}/phone/verify?id=#{user.id}&code=#{user.phone_verification_code}"
  CoreIntegrations::Sinch.send_text(message, phone)
end

我希望如何 look/work:

user.phone=(phone) do
  message = "Verify your phone number #{@host}/phone/verify?id=#{user.id}&code=#{user.phone_verification_code}"
  CoreIntegrations::Sinch.send_text(message, phone)
end

这是我遇到的错误

/Users/christianjuth/Desktop/apollo-8/app/controllers/application_controller.rb:140: syntax error, unexpected keyword_do, expecting keyword_end /Users/christianjuth/Desktop/apollo-8/app/controllers/application_controller.rb:267: syntax error, unexpected keyword_end, expecting end-of-input

行号可能与 repo 同步,以防我对应用程序控制器进行了一些本地更改。

...或者类似的东西。 user 是一个 ActiveRecord 模型。我想这样做的原因是,仅当发送到 user.phone= 的变量 phoneuser.phone 的现有值不同时,yield 才会被调用。

我认为这更多是语法问题,但以防万一 here is repo 的上下文。您正在查看的代码位于 app/controllers/application_controller.rb 中,用户模型可以在 user/models/user.rb.

中找到

更新:我在调用 setter 时遇到问题,而 yield 没有定义它。抱歉造成混淆。

如果您将方法从 def set_phone 更改为 def phone= 那么将更难调用,但仍有可能:

user.send :phone=, phone do
  # ...
end