Rails从关联

时间:2016-02-03 11:58:29

标签: ruby-on-rails

我不知道问题的标题是否正确。

我有位置,硬件和hardware_type表,但没有嵌套路由。 我已经建立了关系,以便位置具有硬件和硬件属于hardware_categories以及互惠关系。

在我的位置控制器中的show动作

class LocationsController < ApplicationController
before_action :set_location, only: [:show, :edit, :update, :destroy]

# GET /locations
# GET /locations.json
def index
   @locations = Location.all
end

 # GET /locations/1
 # GET /locations/1.json
 def show
   @hardwares = Hardware.where(:location_id => params[:id])
 end

并在我的展示页面

  <% @hardwares.each do |hardware| %>
    <tr>
      <td><%= hardware.name %></td>
      <td><%= hardware.asset_tag %></td>
      <td><%= hardware.serial_number %></td>
      <td><%= hardware.note  %></td>
      <td><%= hardware.hardware_category_id  %></td>
    </tr>
  <% end %>

这有效,而hardware.hardware_category_id返回正确的数字。

我想显示hardware_category的名称

我想像

      <td><%= hardware.hardware_category_id.name  %></td>

可以工作,但我得到1的未定义方法`name':Fixnum如何才能访问这些数据

schema`create_table“hardware_categories”,force:true do | t |     t.string“name”     t.datetime“created_at”     t.datetime“updated_at”   端

create_table“hardwares”,force:true do | t |     t.string“name”     t.string“asset_tag”     t.string“serial_number”     t.text“description”     t.text“note”     t.string“成本”     t.date“purchase_date”     t.date“warranty_end_date”     t.date“eol”     t.datetime“created_at”     t.datetime“updated_at”     t.string“mdl”     t.integer“location_id”     t.integer“hardware_category_id”     t.integer“manufacturer_id”     t.integer“supplier_id”   end`

2 个答案:

答案 0 :(得分:1)

<%= hardware.hardware_category.name %>你需要的是什么。

不需要_id。关联的名称与您在模型中定义的名称相同。我假设它像:

belongs_to :hardware_category

我建议您在尝试执行更多操作之前阅读本指南。 http://guides.rubyonrails.org/association_basics.html

您看到该错误的原因是因为hardware_category_id正是如此,整数(FixNum)和FixNum类没有名为name的方法/属性。< / p>

-

Rich Peck编辑

更好的方法是使用.try评估相应的hardware_category是否存在...

<%= hardware.hardware_category.try(:name) %>

...这会阻止任何&#34;未找到&#34;如果相应的对象不存在则会出错。

答案 1 :(得分:0)

hardware.hardware_category_id.name找到hardware_category_id,然后找到该ID的名称。

在这种情况下hardware.hardware_category_id == 1

因此,您正在调用1.name并且1是一个fixnum,并且没有方法名称,您将获得name的未定义方法1:Fixnum error

您可以在名为hardware_category_name的硬件中创建新字段,然后调用hardware.hardware_category_name