前書き: サービス オブジェクトの概念を誤解している可能性があり、別の実装を設計する必要があります。前もって感謝します。
SMS 確認用のサービス オブジェクトを作成します。ユーザーは次の場合に自分の行動を確認する必要があります。
- 彼は電話番号を送信します (自分のプロフィールを更新します)。
- 彼は取引を確認します。
- 彼は他の重要な行動をとります。
コード:
profile_controller:
def update
@profile.assign_attributes(profile_params)
if @profile.valid?
confirm = SmsConfirmationService.new({user: current_user,
phone: profile_params["phone"],
kind: :phone})
confirm.confirm_phone
else
...
end
end
sms_confirmation_service:
class SmsConfirmationService
attr_reader :status
def initialize(params)
@user = params[:user]
@phone = params[:phone]
@kind = params[:kind]
end
def create_pin
pin = Pin.new(code: rand(0000..9999).to_s.rjust(4, "0"),
profile_id: @user.profile.id)
pin.save
send_sms(pin.code)
end
def send_sms(code)
# call to SMS-provider API and check the status
render_view
end
def render_view
template = ActionView::Base.new(ActionController::Base.view_paths, {})
if @kind == :phone
template.render(file: 'confirmation/confirm_phone')
end
end
end
render_view メソッドに固執しました。「Missing template profile/update」が表示されますが、ログによると、テンプレートは次のようにレンダリングされます。
....
Rendered confirmation/confirm_phone.html.haml (6.7ms)
(0.1ms) begin transaction
SQL (0.2ms) INSERT INTO "pins" ("code", "profile_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["code", 7811], ["profile_id", 7], ["created_at", "2016-08-26 15:45:02.751384"], ["updated_at", "2016-08-26 15:45:02.751384"]]
(1.0ms) commit transaction
(0.1ms) begin transaction
(0.1ms) commit transaction
Completed 500 Internal Server Error in 1070ms (ActiveRecord: 3.3ms)
ActionView::MissingTemplate (Missing template profile/update, application/update with {:locale=>[:ru], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :haml, :jbuilder]}.
それを解決する方法は?