【问题标题】:How to use an if statement to filter records from a model object ror如何使用 if 语句从模型对象 ror 中过滤记录
【发布时间】:2014-01-21 07:19:58
【问题描述】:

我有服务和服务预订模型,我想通过检查服务预订模型中的 owner_id 属性来查看当前用户进行服务预订。

我的服务预订控制器方法:

def myservicebookings
  if current_user.id == @servicebooking.owner_id
    @servicebookings = current_user.servicebookings.search(params[:search]).order(sort_column + " " + sort_direction).paginate(:per_page => 5, :page => params[:page])
  else
    "You have no service bookings"
  end
end

我的服务预订视图:

<% if current_user.id == @servicebooking.owner_id %><% @servicebookings.each do |servicebooking| %>
    <tr>
      <td><%= servicebooking.date %></td>
      <td><%= servicebooking.time %></td>
      <td><%= servicebooking.service_name %></td>
    </tr>
  <% end %>
  <% else %>
  <%= "You have no outgoing service bookings" %>
  <% end %>

目前我在尝试加载 myservicebookings 表单时收到以下错误:

nil:NilClass 的未定义方法 `owner_id'

关于如何更改此代码以使其正常工作的任何想法?在此先感谢各位。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.2 ruby-on-rails-4


    【解决方案1】:

    在您的情况下,您不需要 if 语句,因为在此变量中您拥有所有当前用户服务预订:

    def myservicebookings
      @servicebookings = current_user.servicebookings.
                         ^^^^^^^^^^^^ search(params[:search]).
                                      order(sort_column + " " + sort_direction).
                                      paginate(:per_page => 5, :page => params[:page])
    end
    

    使用这个:

    <% if @servicebookings.any? %>
    <% @servicebookings.each do |servicebooking| %>
        <tr>
          <td><%= servicebooking.date %></td>
          <td><%= servicebooking.time %></td>
          <td><%= servicebooking.service_name %></td>
        </tr>
      <% end %>
    <% else %>
      <%= "You have no outgoing service bookings" %>
    <% end %>
    

    或者这个:

    <% if @servicebookings.any? %>
    <% for servicebooking in @servicebookings %>
        <tr>
          <td><%= servicebooking.date %></td>
          <td><%= servicebooking.time %></td>
          <td><%= servicebooking.service_name %></td>
        </tr>
      <% end if current_user.id == servicebooking.owner_id %>
    <% else %>
      <%= "You have no outgoing service bookings" %>
    <% end %>
    

    【讨论】:

    • +1 用于.any? -> 如果accessible_attributes.any? -> 如果我有任何可访问的属性。红宝石> [假,假,假,无,无]。任何? => 错误
    【解决方案2】:

    你应该在你的视图中切换循环和if语句的位置,然后使用循环变量servicebooking而不是实例变量@servicebooking,让它看起来像这样

    <% @servicebookings.each do |servicebooking| %>
      <% if current_user.id == servicebooking.owner_id %>
         the rest of the view ...
    

    更新:如果你想在控制器层面更新,那么几乎是一样的:

    @servicebookings = current_user.servicebookings.search(params[:search]).order(sort_column + " " + sort_direction).paginate(:per_page => 5, :page => params[:page])
    @servicebookings.select! { |servicebooking| servicebooking.owner_id == current_user.id }
    

    【讨论】:

    • 嘿,艾哈迈德,感谢您的回答,我已将此 if 语句移至 myservicebookings 控制器方法中,但出现相同的错误:nil:NilClass 的未定义方法 `owner_id' - if 语句在视图中有效根据您的指示,但返回了所有服务预订,包括与所有者 ID 匹配的服务预订,所以我想在控制器级别进行过滤,请查看我编辑的问题,如果您有提示,请告诉我?提前致谢
    • 我在您的问题中看不到更新,请您再次检查并发布更新后的控制器的 sn-p 吗?
    • 再一次,您使用的是未定义的实例变量@servicebooking,因此出现错误。如果要在控制器中进行过滤,则还需要将循环移至控制器。请参阅代码示例的更新答案。另一方面,如果您发布带有表模式的模型会更有帮助。
    • 谢谢 Ahmad,我稍后会测试一下
    • 嘿,艾哈迈德,你有我应该如何使用控制器中的循环与 .select 的示例!方法和视图应该如何?提前致谢。
    【解决方案3】:

    我不会弄乱我的视图或控制器。我会去 OOPS 这里。在 RoR 中,它的瘦控制器、胖模型。

    转到你的模型,

    class ServiceBooking < ActiveRecord::Base
    
      # u = User, srch = params[:search],p = params[:page],p_p = per_page,s_c =sort_columns, s_d = sort_direction
      def self.mine(u,srch,s_c,s_d,p,p_p = 5)
        u.servicebookings.search(srch).order(s_c + " " + s_d).paginate(per_page: p_p, page: => p)
      end
    
    end
    

    在您的控制器中,

    def myservicebookings
      # 6th argument to this method is overridable.
      @mine = ServiceBooking.mine(current_user,params[:search],sort_column,sort_direction,params[:page])    
    end
    

    在你看来,

    <% @mine.each do |m| %>
        <tr>
          <td><%= m.date %></td>
          <td><%= m.time %></td>
          <td><%= m.service_name %></td>
        </tr>
    <% end %>
    

    【讨论】:

    • 这个逻辑看起来不错,但我认为它不会检查用户是否拥有服务预订本身
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2022-12-05
    相关资源
    最近更新 更多