我实际上不知道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
值。
答案 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
视图中,您只是希望他们看到本课程的主题,对吗?-
因为您之前没有传递任何集合,所以没有'name'方法/列用于simple_form作为下拉列表中的标签/显示值,因此您收到的有关{{1}的错误消息}
如果/当您删除Array ["Yes",true]
选项时,您可能会看到与下拉列表中的预期行数一样多的选项,而不是您将看到的课程主题名称列表主题对象列表(类似这样):
label_method: :name, value_method: :id,
并且,当您不提供集合时,您只获得2个是/否值,这是您找到的配置文件(#<Topic::xxxx>
#<Topic::xxxx>
...
#<Topic::xxxx>
)的simple_form默认值。
所以,你可能已经猜到了,这就是你最终使用的原因......
config/locales/simple_form.en.yml
...有点“工作”作为解决方法 - 因为它 *做* 执行正确的查询并将其提供给simple_form,但它将结果限制为仅仅 *表格中的第一个* 主题(没有任何排序/排序)
至少,这是我学到的经历。 HTH!