Ruby on rails 如何在aasm事件中返回值?

Ruby on rails 如何在aasm事件中返回值?,ruby-on-rails,aasm,Ruby On Rails,Aasm,如何使aasm事件返回布尔值以外的值?我使用的是aasm 2.2.0 例如,有一个MusicLayer模型,它在启动时随机播放一首歌曲 aasm_state :started, :after_enter => :play_song aasm_state :stopped aasm_event :start do :transitions :from => :stopped, :to => :started end def play_song # select and

如何使aasm事件返回布尔值以外的值?我使用的是aasm 2.2.0

例如,有一个MusicLayer模型,它在启动时随机播放一首歌曲

aasm_state :started, :after_enter => :play_song
aasm_state :stopped
aasm_event :start do
  :transitions :from => :stopped, :to => :started
end

def play_song
  # select and play a song randomly and return the song object
end

现在,如果我想在启动播放机时返回当前正在播放的歌曲,如何通过“播放歌曲”方法进行返回?

您不能这样做。返回状态用于指示转换是否成功。但我很好奇你有什么用例需要它

但是您可以包装状态转换并使用由
play\u song
方法设置的变量,如下所示:

aasm_state :started, :after_enter => :play_song
aasm_state :stopped
aasm_event :start do
  :transitions :from => :stopped, :to => :started
end

def play_song
  # select and play a song randomly
  @song = ...
end

def shuffle
  if start
    @song
  end
end

上面的场景就是用例。嗯,我明白了。你不仅想知道是不是在玩,还想知道玩了什么。这不是一个很容易用状态机解决的问题。假设您有两个回调,例如一个在回车前,一个在回车后回调。那么你会返回哪个结果?我可能会将该逻辑排除在状态机之外,并包装状态转换方法。让我更新我的答案,了解我的意思。没错。这实际上更有意义,因为当前歌曲提供了音乐播放器的状态。