【问题标题】:acts_as_state_machine helper method rails 6act_as_state_machine 辅助方法 rails 6
【发布时间】:2020-08-08 10:02:53
【问题描述】:

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

  <% @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

【问题讨论】:

    标签: ruby-on-rails ruby rubygems ruby-on-rails-6 aasm


    【解决方案1】:

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

    AASM 将为您定义的每个状态定义公共实例方法,您可以使用这些方法检查您的状态。因此,在您的情况下,您的实例上将有 .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.verified,但Booking 是类,AASM 方法是实例方法(也就是说,它们仅在Bookinginstance 上调用时才有效。您需要通过个人预订从视图中将其实例作为参数(正如@gordon 在他们的回答中所说)。第二个问题是方法是.verified?(问号是方法名称的一部分)。所以:

    def verified_booking(booking)
      booking.verified?
    end
    

    【讨论】:

    • 我是初学者,如何将 aasm 生成的方法构造成辅助方法?
    • 您能否将模型的 aasm 定义(至少是相关部分)添加到您的问题中?就您的观点而言,“已验证”是单个状态还是某个特定点之后的任何状态?
    • 我加了,看看吧
    【解决方案2】:

    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 生成的方法构建到 applicationhelper.rb 块语句中?
    猜你喜欢
    • 2012-12-30
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多