acts_as_state_machine 辅助方法 rails 6

acts_as_state_machine helper method rails 6

我的预订模型中有已验证和未验证状态,如何为我的视图实现辅助方法?我希望在我的索引视图中有这样的内容。

  <% @bookings.each do |booking| %>
    <%= link_to booking_path(booking) do %>
        <%= booking.name %>
        <% if verified_booking %>/* here is where i want implemented*/
            <div class="pt-4 font-semibold"><i class="fa fa-user-check"></i></div>
        <% end %     
    <% end %>
    </div>
  <% end %>

辅助方法

  def verified_booking
    !!Booking.verified
  end

预订模式

  include AASM
  aasm :column => :state, :whiny_transitions => false do
    state :unverified, initial: true
    state :verified
    event :verify do
      transitions from: [:unverified], to: :verified
    end
  end

ApplicationHelper.rb

def verified_booking(state)
 # check state in the database if it is verified
 # return true if state is verified
 # return false if not verified
end

html.erb

<% @bookings.each do |booking| %>
    <%= link_to booking_path(booking) do %>
        <%= booking.name %>
        <% if verified_booking(booking.state) %>/* here is where i want implemented*/
            <div class="pt-4 font-semibold"><i class="fa fa-user-check"></i></div>
        <% end %     
    <% end %>
    </div>
  <% end %>

编辑 删除了示例 AASM 定义,因为您将自己的定义添加到了问题中。

AASM 将为您定义的每个状态定义 public 个实例方法,您可以使用这些方法来检查您的状态。因此,在您的情况下,您的实例将有 .verified?.unverified? 方法。你可以直接在视图中使用这些方法,所以你真的不需要辅助方法:

<% @bookings.each do |booking| %>
  <%= link_to booking_path(booking) do %>
    <%= booking.name %>
    <% if booking.verified? %>
      <div class="pt-4 font-semibold"><i class="fa fa-user-check"></i></div>
    <% end %>     
  <% end %>
  </div>
<% end %>

但是,如果您想了解为什么您的问题中的辅助方法不起作用,您在问题中提供的辅助方法将不起作用,原因有两个。您调用 Booking.verifiedBooking 是 class 并且 AASM 方法是实例方法(也就是说,它们仅在调用 实例 时有效Booking。您需要将视图中的单个预订实例作为参数传递给它(正如@gordon 在他们的回答中所说)。第二个问题是方法是 .verified?(问号是部分方法名称)。因此:

def verified_booking(booking)
  booking.verified?
end