undefined方法`name'为[“Yes”,true]:Array

时间:2012-11-22 21:21:48

标签: ruby-on-rails ruby-on-rails-3

我实际上不知道Array [“是”,true]来自哪里。我有两个这样的模型:

GeneralExam has_many topic_questions

TopicQuestion belongs to general_exam, belongs_to topic

在TopicQuestion中,我有一些列:general_exam_id,topic_id,number_question,用于存储一般考试中每个主题的数字问题。

我为创建新的常规考试构建了一个嵌套表单,在表单中我构建了一个动态选择,当用户从下拉列表中选择一个课程时,我有其他下拉列表来显示用户选择的主题。

这是我动态选择的javascript代码:

<% content_for :head do %>
  <script type="text/javascript">
    $(document).ready(function() {
      $('#general_exam_course_id').change(function () {
        $.ajax({
          type: "POST",
          url: "<%= update_topics_general_exams_path %>",
          data: { course_id: $('#general_exam_course_id').val() },
          dataType: "script"
        });
      });
    </script>
<% end %>
选项课程的

#general_exam_course_id ID 下拉列表。 update_topics_general_exams_path是我在常规考试控制中的update操作的路线,这是我的update操作:

  def update_topics
    @course = Course.find(params[:course_id])
    @topics = @course.topics
  end

我还有update_topics.js.erb

$('div#topic_questions select').html("<%= j options_from_collection_for_select(@topics, 'id', 'name') %>");

div#topic_questions中的下拉列表将从@topics操作获得update_topics值(我认为是这样)并显示它。当我创建新的普通考试时,没关系。但是,当我按Edit链接时,它会显示一个错误,我不知道为什么以及它来自哪里:

NoMethodError in General_exams#edit
undefined method `name' for ["Yes", true]:Array

Extracted source (around line #3):

1: <div class="row">
2:  <div class="span6"><%= remove_child_link "Remove below topic", f %></div><br><br>
3:  <div class="span3"><%= f.association :topic, collection: @topics, label_method: :name, value_method: :id, prompt: "Choose a topic", label: false %></div>
4:  <%= f.input :number_question, placeholder: 'Number of questions', label: false, style: 'display: inline' %>
5: </div>

我的edit操作只有:@general_exam = GeneralExam.find(params[:id])。我不知道为什么topic一般考试的关联字段显示数组[“是”,真实]。我没有它,不要在任何地方定义它,为什么它在我编辑普通考试时会出现?

更新

如果我删除了label_method: :name, value_method: :id

<%= f.association :topic, collection: @topics, label_method: :name, value_method: :id, prompt: "Choose a topic", label: false %>

该页面不是错误,但下拉列表在select中有值Yes, No,而不是我为考试创建的主题名称。表格可以得到每个主题的数字问题,但不能得到主题的名称。

当我创建:

image http://s12.postimage.org/d61sfvx0d/topic_field1.png

编辑时:

image http://s15.postimage.org/5bslku0jv/topic_field2.png

我在config/locales/simple_form.en.yml中找到了这个:

en:
  simple_form:
    "yes": 'Yes'
    "no": 'No'

这是一个问题吗?

更新:不要在新操作中传递@topics但它仍然在新页面上当未选择课程时

我的新动作:

  def new
    @general_exam = GeneralExam.new
    5.times { @general_exam.topic_questions.build }
    #@topics = Topic.all
  end

正如我上面的摘录源中所示,我在下面的代码中也有新的编辑(使用相同的形式):

<%= f.association :topic, collection: @topics, label_method: :name, value_method: :id, prompt: "Choose a topic", label: false %>

所以我没有传递@topics,但是当我转到新页面时,主题的下拉列表仍显示Yes, No值。

2 个答案:

答案 0 :(得分:2)

好的,我们聊天评论的时间结束了:)(系统建议移动到聊天室)。解决方案似乎是在simple_form的关联中内联集合:

<%= f.association :topic, collection: @topics, label_method: :name, value_method: :id, prompt: "Choose a topic", label: false %>

成为:

<%= f.association :topic, collection: Topic.limit(1), prompt: "Choose a topic", label: false %>

我认为现在可行。

答案 1 :(得分:1)

通过将查询分配给@topics并将其传递给您的视图,您就有了正确的想法......但是,您将其置于错误的操作中并且不将它们传递给正确的视图:< / p>

def update_topics
  @course = Course.find(params[:course_id])
  @topics = @course.topics
end

-

你应该做什么:

您的更新操作没有update view,因此,您必须放置以下两行:

@course = Course.find(params[:course_id])
@topics = @course.topics

在您的new操作和edit操作

然后你可以继续使用你原来的simple_form代码,这个代码是正确的:

<%= f.association :topic, collection: @topics, 
                  label_method: :name, value_method: :id, 
                  prompt: "Choose a topic", label: false 
%>

或者,您可以在控制器中 SKIP @topics,只需在视图中添加以下内容:

视图

<%= f.association :topic, collection: Topics.all, 
                  label_method: :name, value_method: :id, 
                  prompt: "Choose a topic", label: false 
%>

修改视图

<%= f.association :topic, collection: Course.find(params[:course_id]).topics, 
                  label_method: :name, value_method: :id, 
                  prompt: "Choose a topic", label: false 
%>

注意区别:

  • 我认为在您的new视图中,您希望用户看到所有可能的主题。
  • edit视图中,您只是希望他们看到本课程的主题,对吗?

-

为什么会这样:

  1. 因为您之前没有传递任何集合,所以没有'name'方法/列用于simple_form作为下拉列表中的标签/显示值,因此您收到的有关{{1}的错误消息}

  2. 如果/当您删除Array ["Yes",true]选项时,您可能会看到与下拉列表中的预期行数一样多的选项,而不是您将看到的课程主题名称列表主题对象列表(类似这样):

    label_method: :name, value_method: :id,
  3. 并且,当您不提供集合时,您只获得2个是/否值,这是您找到的配置文件(#<Topic::xxxx> #<Topic::xxxx> ... #<Topic::xxxx> )的simple_form默认值。

  4. 所以,你可能已经猜到了,这就是你最终使用的原因......

    config/locales/simple_form.en.yml

    ...有点“工作”作为解决方法 - 因为它 *做* 执行正确的查询并将其提供给simple_form,但它将结果限制为仅仅 *表格中的第一个* 主题(没有任何排序/排序)

  5. 至少,这是我学到的经历。 HTH!