如何使用if语句从模型对象ror中过滤记录

时间:2014-01-21 07:19:58

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

我有服务和服务预订模型,我想通过检查服务预订模型中的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表单时出现以下错误:

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

有关如何更改此代码以使其有效的任何想法?先谢谢你们。

3 个答案:

答案 0 :(得分:1)

您应该在视图中切换循环和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 }

答案 1 :(得分: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 %>

答案 2 :(得分:0)

我不会弄乱我的观点或我的控制器。我会在这里去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 %>