在选择该课程时,我使用了一个动作来显示课程的所有主题。现在我想使用虚拟属性在表单上显示一个字段number_question
,以便每个使用的主题都可以输入一个数字。我的模特:
class GeneralExam < ActiveRecord::Base
attr_accessible :course_id, :description
attr_accessor :numbe_question
end
这是我的表格:
<%= simple_form_for @general_exam, defaults: { error: false } do |f| %>
<fieldset>
<legend>General Exam information</legend>
<%= render 'shared/error_messages', object: f.object %>
<%= f.association :course, collection: current_user.courses, prompt: "Choose Course for exam" %>
<%= f.input :name %>
<%= f.input :description, input_html: { rows: 2, class: 'span6' } %>
</fieldset>
<fieldset>
<legend>Choose number question for topics</legend>
<div id="list_topics">
</div>
</fieldset>
<%= f.submit class: "new_resource" %>
<% end %>
这是我的行动:
def update_topics
@course = Course.find(params[:course_id])
@topics = @course.topics
end
我的update_topics.js.erb
$('#list_topics').html("<%= j (render('general_exams/list_topics')) %>")
我的_list_topics.html.erb
部分:
<% @topics.each do |topic| %>
<h5><%= topic.name %></h3>
<%# f.input :number_question, input_html: { name: "number_question[#{topic.id}]" } %>
<% end %>
但是如果我想显示输入字段,我必须有一个f
对象,但是当我渲染_list_topics
时,我没有。所以我想问一下如何将f
形式的对象传递给部分_list_topics
?
或者有人可以告诉我如何使用jquery在表单上的h5
元素之后添加输入字段,非常感谢。
答案 0 :(得分:2)
我认为有一些不同的方法可以解决这个问题。其中两个(我是:
1)您可以定义一个不同的表单,将number_question数据发布到另一个控制器操作。 2)当用户完成更新字段值时,使用jquery的更改回调提交number_question。
我认为第一个选项更好,更容易编码。你最终会得到这样的东西:
<%= simple_form_for @general_exam, defaults: { error: false } do |f| %>
<fieldset>
<legend>General Exam information</legend>
<%= render 'shared/error_messages', object: f.object %>
<%= f.association :course, collection: current_user.courses, prompt: "Choose Course for exam" %>
<%= f.input :name %>
<%= f.input :description, input_html: { rows: 2, class: 'span6' } %>
</fieldset>
<%= f.submit class: "new_resource" %>
<% end %>
然后,您将在同一模板上使用不同的表单(提交主题编号):
<%= simple_form_for @general_exam, url: whatever_is_your_new_topics_number_path, defaults: { error: false } do |f| %>
<fieldset>
<div id="list_topics">
</div>
</fieldset>
<% end %>
您将继续回复您的JS部分,相应地将div的内容替换为主题数据。