0

私は、初心者の質問であると確信しています...

顧客に配送された製品のリストを表示しているビューがあります。検索フィールドと並べ替え可能な列とページネーションのモデルとして、Ryan Bates の railscast をいくつか使用しました。

ページネーションと検索は正常に機能します。ただし、見つけられないように見える2つの問題があります。

1) 製品の ID ではなく顧客の名前を表示しようとすると、'name' メソッドが定義されていないというエラーが表示されます。

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

何が起こっているのかを理解するために誰かが他に何が必要なのかわからないので、さらに情報が必要な場合はお知らせください.

実行時にサーバーに表示されるのは次のとおりです。

127.0.0.1 の GET "/products" を 2012-06-27 14:04:11 -0600 で開始 database.yml で指定したデータベースに接続 ProductsController#index で HTML として処理 ←[1m←[36mProduct Load (60.0ms)← [0m ←[1mSELECT products.* FROM productsORDER 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. どこcustomersからcustomersid= 0 LIMIT 1←[0m Rendered products/_products.html.erb (535.0ms) Rendered products/index.html.erb within layouts/application (660.0ms) 完了 500 Internal Server Error in 895ms

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__429528032_35444568' app/views/products/_products.html.erb:16 の未定義のメソッド ブロック: _app_views_products_index_html_erb___506300995_27575616 ' _app_views_products__products_html_erb__429528032_35444568' app/views/products/index.html.erb:8:inapp/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内のrescues/layout (65.0ms)

4

1 に答える 1

1

スタックトレースから、次のことがわかります。

name' for nil:NilClass)

これは、顧客オブジェクトがnullであることを意味します。したがって、SQLは製品オブジェクトに添付された顧客オブジェクトを返しません。

ここにあなたのコード:

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

顧客オブジェクトではなく、name属性でnilをテストしているため、キャッチされません

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

これでエラーは修正されますが、それでも顧客名は表示されません。

問題を実際に修正するには、モデルコードで製品と顧客の関係を確認し、そこから取得したSQLをデバッグして、製品と顧客の結合を確認する必要があります。

has_many:製品がcustomerオブジェクトで宣言されているかどうかを確認します。

更新:製品モデルで、製品テーブルでcustomer_idを宣言したこともわかりますか?!つまり、製品には1人の顧客しか持てません!!! それがあなたが望むものかどうかわからない!;-)

ここに関係へのレールガイドのリンクがあります、それは私がレールで働いたときの私の聖書でした

UPDATE 2 Active Record Queryインターフェースを確認した後、私が望むものを取得するには、次のようなことを行う必要があります。

Products.joins(:customer).where("name like ?", %#{search}%)
于 2012-06-26T19:34:39.897 に答える