如何为立即使用的变量创建输入表单

时间:2013-06-27 09:43:29

标签: ruby-on-rails

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

1 个答案:

答案 0 :(得分:1)

您可以将ActiveModel::Model传递给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一起使用,指定自定义网址以确保其POST回到当前页面并且不会尝试查找student_group_informations路由:

<%= form_for @student_group_information, url: request.fullpath do |form| %>
  …
<% end %>