2014-01-21 94 views
0

我有服务和服务预订模型,我想通过检查servicebooking模型中的owner_id属性来查看当前用户提出的服务预订。如何使用if语句来过滤来自模型对象的记录ror

我servicebooking控制器的方法:

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 

我servicebookings查看:

<% 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”为零:NilClass

任何想法如何更改此代码以使其工作?在此先感谢你们。

回答

1

您应该切换循环的位置,如果在你的view语句,然后使用循环变量servicebooking不是实例变量@servicebooking,使它看起来像这样

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

UPDATE:如果您想在控制器级别更新,那么它的几乎是相同的:

@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 } 
+0

嘿艾哈迈德感谢您的回答,我已经if语句到迁此myservicebookings控制器方法和我得到了同样的错误:未定义的方法'owner_id'为零:NilClass - if语句工作在视图中根据您的指示,但是返回了包括与所有者ID匹配的所有服务簿,所以我想在控制器级别进行过滤,请参阅我编辑的问题,并让我知道您是否有提示?在此先感谢 – Joshua

+0

我无法看到您的问题中的更新,请您再次检查并发布更新的控制器的片段? –

+0

我的歉意请看更新的答案 – Joshua

1
在你的情况下

,你不需要,如果statment因为在这个变量你把所有的当前用户本身rvicebooking:

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 %> 
+0

+1对于使用.any? - >如果accessible_attributes.any? - >如果我有任何可访问的属性。 ruby​​> [false,false,false,nil,nil] .any? => false – Rubyist

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 %> 
+0

这个逻辑看起来不错,但我不认为它会检查用户是否拥有服务预订本身 – Joshua

相关问题