NoMethodError未定义方法FixNum - Rails 4

时间:2016-09-16 20:40:05

标签: ruby-on-rails postgresql activerecord nomethoderror

我有一个agent_review模型和一个代理模型。在agent_review表中有一个名为" reviewer_id"的列。这是审查代理的代理的ID。我在从id获取审阅者的名称时遇到问题。我希望这是有道理的。以下是相关代码。提前谢谢。

代理商模型

has_many :agent_reviews

Agent_Review模型

belongs_to :agent

Agent_Reviews控制器 - 索引方法

def index
   @agent = Agent.find(params[:agent_id])
   @agent_reviews = @agent.agent_reviews.order(created_at: :desc)
end

Agent_Review /索引

<div class="mega-container"><br>
   <div class="text-center">
      <h1>Agent Reviews</h1>
      <h3><%= @agent.name %></h3>
      <div class="container feedback-index">
         <% @agent_reviews.each do |agent_review| %>
            <div class="row feedback-strip">
               <p>Submitted: <%= agent_review.created_at.strftime('%D @ %I:%M %p') %></p>
               <p>Name: <%= agent_review.agent.name %></p>
               <p class="star-rating" data-score= <%= agent_review.rating %> >Rating: </p>
               <p>Review: <%= agent_review.comment %></p>
            </div><br>
         <% end %>
      </div>
    </div>
  </div>

错误

enter image description here

模式

create_table "agent_reviews", force: :cascade do |t|
  t.integer  "agent_id"
  t.integer  "reviewer_id"
  t.text     "comment"
  t.integer  "rating"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end

4 个答案:

答案 0 :(得分:2)

agent_review.reviewer_id会返回一个整数(Fixnum),您无法在name对象上调用Fixnum方法。

您的关联存在问题,因为您没有遵循设置外键的rails方式。首先,您需要在agent_review模型中指定您用作外键的列。

# in agent_review.rb

belongs_to :agent, foreign_key: 'reviewer_id'

然后尝试

<%= agent_review.agent.name %>

从审核中检索代理的名称。

修改

如果要检索有关审核者的信息,请向agent_review.rb

添加新关联
belongs_to :reviewee, class_name: 'Agent', foreign_key: 'agent_id'

现在,您可以致电agent_review.reviewee,它会为您提供有关受审核人的信息。

答案 1 :(得分:1)

首先需要循环,因为控制器中未定义agent_review

<% @agent_reviews.each do |agent_review| %>
  # YOUR HTML CODE HERE
<% end %>

另外,如果那只是因为它不包括在内,可能是因为agent_review.reviewer_id返回的是数字而不是实际的reviewer。你的关联不完整,所以你的意思是agent_review.agent?这应该指向正确的方向!希望这会有所帮助。

答案 2 :(得分:0)

你想做

<html>
<body>
Some content
<!--#include virtual="name_of_first_file_to_include" -->
More content
<!--#include virtual="name_of_second_file_to_include" -->
Still more content
</body>
<html>

agent_review.reviewer.name 是一个int(即Fixnum),而agent_review.reviewer_id是您正在寻找的对象。

答案 3 :(得分:0)

您的代理模型有许多agent_reviews,因此作为@agent_review传递给索引的内容实际上是一个数组,因此您需要在视图中循环遍历该数组以访问单个对象弥补那个数组。