【问题标题】:NoMethodError Undefined Method FixNum - Rails 4NoMethodError 未定义方法 FixNum - Rails 4
【发布时间】:2016-09-16 20:40:05
【问题描述】:

我有一个 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>

错误

架构

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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord nomethoderror


    【解决方案1】:

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

    您的关联存在问题,因为您没有遵循设置外键的 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,它会为您提供有关被审核人员的信息。

    【讨论】:

    • 我知道这个问题有点老了,但是如果我需要审稿人的名字(我知道有)和他们正在审阅的代理人的名字怎么办?你能帮忙吗?
    • @MikeWiesenhart 要回答这个问题,我需要知道 agent_reviews 表的架构。
    • 我为 agent_reviews 表添加了架构。感谢您的帮助!
    • @MikeWiesenhart 更新了我的答案。看看有没有帮助。如果您还没有,也可以考虑支持我的回答。谢谢!
    【解决方案2】:

    您首先需要一个循环,因为控制器中没有定义agent_review

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

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

    【讨论】:

      【解决方案3】:

      你想做的

      agent_review.reviewer.name
      

      agent_review.reviewer_id 是一个 int(即 Fixnum),而 agent_review.reviewer 是您要查找的对象。

      【讨论】:

      • 这只是给我正在审查的代理,而不是审查者。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多