我有一个“新”页面,其中包含用于创建新学生的表单。在页面顶部,我想提供一个表格,上面写着“你有多少学生?”并让用户输入number_of_students
- 然后将此变量传递给表单 - 类似于
#{number_of_students}.times do
<%= form_for([@student_group, @student]) do |f| %>
...
<% end %>
<% end %>`
如何让form_for number_of_students在同一页面中使用?
编辑:
我使用了georgebrock的建议并做了以下事情:
首先,我这样做howmany.rb
:
class HowMany
include ActiveModel::Model
attr_accessor :number_of_things
IS_A_NUMBER = %q(1..1000)
validates :number_of_things, presence: true,
inclusion: {:in => IS_A_NUMBER,
:message = "%{value} is not a valid number of students" }
end
我做了这些更改,以防我想在其他情况下使用这个模型 - 这种方式更加通用。在我的控制器中,我这样做了:
def new
@student = @student_group.students.build
@how_many = HowMany.new
@title = "Add a student"
end
在“新”视图中,我有以下内容:
<p>
Use the form below to add your students.
</p>
<p>
First, how many students do you have in <%= "#{@student_group.name}" %>?
</p>
<p>
<%= form_for @how_many, url: request.fullpath do |form| %>
<%= form.text_field :number_of_things %>
<% end %>
</p>
但是,我收到以下错误:uninitialized constant StudentsController::HowMany
答案 0 :(得分:1)
您可以将ActiveModel::Model
传递给form_for
,这样您就可以为未存储在数据库中的对象构建表单。
你需要一个看起来有点像这样的类(在Rails 4中):
class StudentGroupInformation
include ActiveModel::Model
attr_accessor :number_of_students
end
如果您使用的是Rails 3,则需要包含ActiveModel
中的各种模块并声明initialize
和persisted?
方法:
class StudentGroupInformation
include ActiveModel::Naming
include ActiveModel::Translation
include ActiveModel::Validations
include ActiveModel::Conversion
attr_accessor :number_of_students
def initialize(params={})
self.number_of_students = params[:number_of_students]
end
def persisted?
false
end
end
在控制器中实例化一个新的:
@student_group_information = StudentGroupInformation.new
然后您可以将其与form_for
一起使用,指定自定义网址以确保其POST回到当前页面并且不会尝试查找student_group_informations
路由:
<%= form_for @student_group_information, url: request.fullpath do |form| %>
…
<% end %>