4

我实际不知道 Array ["Yes",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路线,这是我的行动:updateupdate

  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 %>

该页面没有错误,但下拉列表Yes, No在选择中具有价值,而不是我为考试创建的主题名称。表单可以获取每个主题的编号问题,但不能获取主题名称。

当我创建:

图片

当我编辑时:

图片

我发现这个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值。

4

2 回答 2

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 %>

我认为它现在可以工作。

于 2012-11-22T23:22:55.590 回答
1

通过将查询分配给您的视图并将其传递给您的视图,您得到了正确的想法@topics......但是,您将其置于错误的操作中,而不是将它们传递给正确的视图:

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

-

你应该做什么:

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

@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 
%>

或者,您可以跳过控制器中的@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. 由于您之前没有传递任何集合,因此没有“名称”方法/列供 simple_form 用作下拉列表中的标签/显示值,因此您收到有关的错误消息Array ["Yes",true]

  2. 如果/当您删除label_method: :name, value_method: :id,选项时,您可能会在下拉列表中看到与预期行一样多的选项,但您会看到主题对象列表而不是课程主题名称列表(类似这样):

    #<Topic::xxxx>
    #<Topic::xxxx>
    ...
    #<Topic::xxxx>
    
  3. 而且,当您不提供集合时,您只会获得 2 个是/否值,这是您找到的配置文件 ( config/locales/simple_form.en.yml) 中的 simple_form 默认值。

  4. 所以,正如您现在可能已经猜到的那样,这就是您最终使用的原因...

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

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

至少,这是我学到/经历的。!

于 2013-08-26T16:21:35.557 回答