可排序列和在索引布局上显示关联

时间:2012-06-26 19:21:11

标签: ruby-on-rails ruby-on-rails-3

我确信这是一个不起眼的问题...

我有一个视图,我正在显示交付给客户的产品列表。我使用了几个Ryan Bates的railscast作为搜索字段和可排序列以及分页的模型。

分页和搜索工作正常。但是,我有两个问题似乎无法找到:

1)如果我尝试显示客户的名称而不是产品的ID,我会收到一条错误消息,说明未定义“名称”方法。

2)当我点击列标题更改排序顺序时,没有任何反应。

这是我的代码:

产品控制器:

class ProductsController < ApplicationController
  # GET /products
  # GET /products.json

  helper_method :sort_column, :sort_direction

  def index
    @products = Product.search(params[:search]).order(sort_column + " " +    sort_direction).paginate(:per_page => 25, :page => params[:page])

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @products }
    end
  end
  .
  .
  .
 private
   def sort_column
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
   end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end
end

产品型号:

# == Schema Information
#
# Table name: products
#
#  id             :integer(4)      not null, primary key
#  name           :string(255)
#  serial_number  :string(255)
#  date_ordered   :date
#  date_received  :date
#  date_invoiced  :date
#  vendor_invoice :string(255)
#  scc_invoice    :string(255)
#  quantity       :integer(10)
#  dollar_amount  :integer(10)
#  warranty_years :integer(4)
#  warranty_days  :integer(4)
#  item           :integer(4)
#  comments       :text
#  created_at     :datetime        not null
#  updated_at     :datetime        not null
#  vendor_id      :integer(4)
#  customer_id    :integer(4)
#  category_id    :integer(4)
#  department     :string(255)
#

class Product < ActiveRecord::Base
  attr_protected :id

  belongs_to :customer
  belongs_to :vendor
  belongs_to :category

  def self.search(search)
      if search
          where('name LIKE ?', "%#{search}%")
      else
          scoped
      end
  end
end

产品索引查看:

<% title "Products" %>

<%= form_tag products_path, :method => 'get', :id => "products_search" do %>
    <p>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil%>
    </p>
    <div id="products"><%= render 'products' %></div>
<% end %>

<p><%= link_to 'Add Product', new_product_path %></p>

产品部分视图:_products.html.erb

<%= hidden_field_tag :direction, params[:direction] %>
<%= hidden_field_tag :sort, params[:sort] %>

<table class="pretty">

  <tr>
    <th><%= sortable "name" %></th>
    <th><%= sortable "serial_number" %> </th>
    <th><%= sortable "date_invoiced" %></th>
    <th>Scc invoice</th>
    <th>Customer</th>
    <th></th>
    <th></th>
  </tr>

  <% for product in @products %>

  <tr>
    <td><%= product.name %></td>
    <td><%= product.serial_number %></td>
    <td><%= product.date_invoiced %></td>
    <td><%= product.scc_invoice %></td>
    <td><%= product.customer.name %></td>
    <td><%= link_to 'Show', product %></td>
    <td><%= link_to 'Edit', edit_product_path(product) %></td>
  </tr>

<% end %>

<%= will_paginate @products %>

我不确定有什么人可能需要了解其中的内容,所以如果需要更多信息请告诉我。

以下是我在服务器上运行时看到的内容:

在2012-06-27 14:04:11 -0600开始获取127.0.0.1的“/ products” 连接到database.yml指定的数据库 由ProductsController处理#index为HTML   ←[1m←[36mProduct Load(60.0ms)←[0m←[1mSELECT products。* FROM products ORDER BY name asc LIMIT 25 OFFSET 0←[0m   ←[1m←[35m(0.0ms)←[0m SELECT COUNT()FROM products   ←[1m←[36mCustomer Load(0.0ms)←[0m←[1mSELECT customers FROM customers WHERE customersid = 0 LIMIT 1← [0米   渲染产品/ _products.html.erb(535.0ms)   在布局/应用程序中渲染products / index.html.erb(660.0ms) 在895ms内完成了500内部服务器错误

在_app_views_products__products_html_erb__429528032_35444568中的ActionView :: Template :: Error(未定义的方法name' for nil:NilClass): 20: <td><%= product.serial_number %></td> 21: <td><%= product.date_invoiced %></td> 22: <td><%= product.scc_invoice %></td> 23: <td><%= product.customer.name unless product.customer.name.nil? %></td> 24: <td><%= link_to 'Show', product %></td> 25: <td><%= link_to 'Edit', edit_product_path(product) %></td> 26: </tr> app/views/products/_products.html.erb:23:in阻止'   app / views / products / _products.html.erb:16:in _app_views_products__products_html_erb__429528032_35444568' app/views/products/index.html.erb:8:in块_app_views_products_index_html_erb___506300995_27575616'   app / views / products / index.html.erb:3:_app_views_products_index_html_erb___506300995_27575616' app/controllers/products_controller.rb:11:in索引'

呈现C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.5/lib/action_dispatch/middleware/template s / rescues / _trace.erb(5.0ms)   呈现C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.5/lib/action_dispatch/middleware/template s / rescues / _request_and_response.erb(5.0ms)   呈现C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.5/lib/action_dispatch/middleware/template s / rescues / template_error.erb救援/布局(65.0ms)

1 个答案:

答案 0 :(得分:1)

从你的堆栈跟踪中我们可以看到:

name' for nil:NilClass)

这意味着您的客户对象为空。因此,SQL不会返回附加到产品对象的客户对象。

你的代码在这里:

<%= product.customer.name unless product.customer.name.nil? %>

没有捕获它,因为您在name属性上测试nil,而不是客户对象

<%= product.customer.name unless product.customer.nil? %>

这应该可以解决错误,但您仍然不会看到客户名称!

要真正解决您的问题,您必须在模型代码中验证产品和客户之间的关系,并调试从中获得的SQL,以确保在产品和客户之间看到加入。

检查您是否在客户对象中声明了has_many:产品。

更新:我还在您的产品型号中看到您在产品表中声明了customer_id?!这意味着您的产品只能有1个客户!不确定这是你想要的! ; - )

这是rails guide to relationship上的一个链接,当我使用rails时它是我的圣经

更新2 在查看Active Record Query界面后,为了得到你想要的东西,你应该做类似的事情:

Products.joins(:customer).where("name like ?", %#{search}%)