【问题标题】:Rails: Reference to new Model throwing errorRails:引用新模型抛出错误
【发布时间】:2014-10-03 08:43:21
【问题描述】:

我有一个工作用户表。 我使用以下方法生成了一个新表:

rails generate model quiz_answers

..然后运行 ​​rake db:migrate

我的 CreateQuizAnswers 迁移文件如下所示:

class CreateQuizAnswers < ActiveRecord::Migration
  def change
    create_table :quiz_answers do |t|
      t.references :user, index: true
      t.string :answer1
      t.string :answer2
      t.string :answer3
      t.string :answer4
      t.string :answer5
      t.string :answer6
      t.string :answer7
      t.string :answer8

      t.timestamps
    end
  end
end

我有一个 quiz_answer 模型:

class QuizAnswer < ActiveRecord::Base
    belongs_to :user
end

还有一个 QuizAnswersController:

class QuizAnswersController < ApplicationController
    def new
        @user = current_user
        @quiz_answer = current_user.quiz_answer.build
    end

    private 

    def post_params
        params.require(:quiz_answer).permit(:body, :user_id)
    end
end

我在 routes.rb 中添加了 :quiz_answers 作为资源

已编辑问题:

为什么,那么,当我尝试构建一个表单(使用 Devise)时,我会收到错误“未定义的方法 `body' for...(在此处参考 QuizAnswer)”?我有另一个模型“Post”,它不会产生此错误并且没有“body”属性。

我尝试构建表单的页面是 home/whattypeofleader.html.erb,并且在 routes.rb 中我有:

get "whattypeofleader" => "home#whattypeofleader"

在我的 HomeController 中,我有:

class HomeController < ApplicationController
    def index
    end

    def whattypeofleader
        @user = current_user
        @quiz_answer = current_user.quiz_answer.build
    end
end

我到底做错了什么?任何帮助都非常感谢,谢谢。

哦,如果您需要,这里是表单代码,在 whattypeofleader 中“渲染”的部分代码:

<%= form_for([current_user, @quiz_answer]) do |f| %>
  <p>
    <%= f.text_area :body, :autofocus => true , :class => "elearning-input"%>
  </p>
  <p>
    <%= f.submit("Save entry") %>
  </p>
<% end %>

【问题讨论】:

  • 你在用户模型中添加了has_many关联吗?
  • 我在 user.rb 中有 has_many :quiz_answers
  • @moosefetcher 那么你想要current_user.quiz_answers.build - 复数
  • 模型应该命名为QuizAnswer,而不是QuizAnswers
  • @moosefetcher 按照惯例,模型名称总是单数

标签: ruby-on-rails model-view-controller devise


【解决方案1】:
<%= form_for([current_user, @quiz_answer]) do |f| %>
  #...   
  <%= f.text_area :body, :autofocus => true , :class => "elearning-input"%>

您在此处创建一个 text_area,并告诉 rails 将此文本区域输入绑定到 @quiz_answer.body 属性。为什么?

form_for 将数组的最后一个元素分配为表单的对象。它产生一个表单构建器对象 (f),它保留对此对象 (f.object) 的引用。使用此表单构建器创建的所有字段都会自动填充值f.object.send(:field_name)(它还设置了字段的名称,因此在发布时可以轻松匹配参数)。这是使用模型数据填充所有表单字段的 Rails 魔术。

由于您的模型没有 body 属性(您的数据库中没有这样的列,也没有定义该名称的方法),f.object.send(:body) 会引发 method undefined 错误。

关于此问题的修复,您需要决定如何查找此表单。您的模型包含 8 列,answer&lt;i&gt;(这令人担忧,建议您可能想在此处使用关联)。

【讨论】:

  • 我已从使用“帖子”的工作版本中复制了此表单代码。我只是将 f.text_area 用作测试,因为它适用于“帖子”的情况。我知道 f 是 FormBuider - 我完全理解 OOP。我想了解所谓的轨道“魔法”。为什么'post'可以访问:body(尽管没有body属性)而'quiz_question'没有?为什么“担心”我的表包含 8 列?请解释一下——我的绳索已经到了尽头。谢谢。
  • @moosefetcher - 为什么说posts 没有body 属性?你能发布你的帖子表和帖子模型的架构吗?
  • OK - 'post' 在迁移文件中定义了一个 body 属性,这对我来说是个新闻。谢谢你把我指向那个文件。我想我现在需要问一个新问题:quiz_answers 表应该如何工作。再次感谢。
  • @moosefetcher - 我很难说,因为我不知道它负责什么。但是,每次我看到一长串名为sth_&lt;i&gt; 的列时,我都觉得有些不对劲——这可能会导致代码中出现大量重复或一些奇怪的元循环,从而降低代码的可读性。冷你告诉我这些列(answer1、answer2 等)真正代表什么?
  • 我希望 quiz_answers 存储用户对测验中 8 个问题的回答。我一直在考虑将它们存储在序列化数组中,但我也被告知这是不好的做法。大约 2 个月以来,我一直觉得自己像个铁轨菜鸟,这让我感到非常沮丧。
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多