1

我有一个“新”页面,其中包含一个创建新学生的表格。在页面顶部,我想包含一个表格,上面写着“你有多少学生?” 并让用户输入它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

4

1 回答 1

1

您可以传递ActiveModel::Modelto form_for,它允许您为未存储在数据库中的对象构建表单。

你需要一个看起来有点像这样的类(在 Rails 4 中):

class StudentGroupInformation
  include ActiveModel::Model

  attr_accessor :number_of_students
end

如果您使用的是 Rails 3,您将需要包含来自ActiveModel和声明initializepersisted?方法的各种模块:

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,指定一个自定义 URL 以确保它返回到当前页面并且不尝试查找student_group_informations路由:

<%= form_for @student_group_information, url: request.fullpath do |form| %>
  …
<% end %>
于 2013-06-27T10:05:21.597 回答