如何在 rails 服务对象中显示即显消息

How to display flash messages in rails service object

我想将服务对象添加到我的控制器中。是否有可能将即显消息包含到此服务对象中?

user_stocks_controller

class UserStocksController < ApplicationController
  def create
    @user_stock = UserStocksCreator.new(current_user, params).call
    redirect_to my_portfolio_path
  end
end

服务对象user_stocks_creator

class UserStocksCreator
  def initialize(current_user, params)
    @current_user = current_user
    @params = params[:stock_ticker]
  end

  def call
    stock = Stock.find_by_ticker(params)
    if stock.blank?
      stock = Stock.new_from_lookup(params)
      stock.save
    end
    @user_stock = UserStock.create(user: current_user, stock: stock)
    flash[:success] = "Stock #{@user_stock.stock.name} was successfully added to portfolio"
  end

  private

  attr_accessor :current_user, :params
end

使用这段代码我有一个错误:

undefined local variable or method `flash'

flash 方法仅在控制器中可用。当你想在服务对象中设置flash时,你需要将flash传递给服务对象。

# in the controller
def create
  @user_stock = UserStocksCreator.new(current_user, params, flash).call
  redirect_to my_portfolio_path
end

# in the service
class UserStocksCreator
  def initialize(current_user, params, flash)
    @current_user = current_user
    @params = params[:stock_ticker]
    @flash = flash
  end

  def call
    # unchanged...
  end

  private

  attr_accessor :current_user, :params, :flash
end