6

所以我正在为高中生构建一个 Rails 应用程序,但在创建用户时遇到了问题。

我希望学生只有在选择学校并正确输入学校密码后才能创建帐户。

这样做的正确/最简单的方法是什么?我是否应该为他们必须首先通过的 user#new 操作创建一个看门人,或者如果他们的方式是学生可以在同一页面上提交表单。一种是常规用户名、电子邮件、密码,使用:

form_for @user do
  ...
end

但随后为高中/高中密码选择创建了另一种形式。

理想情况下,控制器将能够获取高中表单的参数,验证这些参数,然后继续从用户参数创建用户。

这可以使用导轨吗?

我的设置:Rails 3 和 Ruby 1.9.2dev

谢谢!

4

3 回答 3

9

您可以使用 fields_for ( http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for )执行此操作

您的视图看起来像

form_for @user do |f|
  fields_for @school do |school|
    school.text_field     :name
    school.password_field :password
  end

  f.text_field     :username
  f.text_field     :email
  f.password_field :password
  f.submit "Submit"
end

然后在您的控制器中, params[:user] 将代表用户数据,而 params[:school] 将代表学校名称/密码。

然后,您可以在创建用户之前验证正确的学校密码。

于 2010-03-20T03:41:10.457 回答
4

jrallison 是对的fields_for,但我建议考虑是否有必要在同一表格上同时执行这两项操作。

您用学校名称和密码描述的内容听起来很像用户身份验证。它可能不是一个人意义上的“用户”,但在这种情况下,“用户”是学校。也许你应该这样对待它:有一个单独的登录表单,如果他们成功就创建一个会话(这样他们以后就不必一遍又一遍地输入他们学校的密码),然后做标准的闪存消息等等如果他们失败了。

此时,您需要的表单是简单且单一模型的。如果以后需要其他功能并且需要学校密码,那么您已经领先了一步。

于 2010-03-20T06:02:45.387 回答
0

我不熟悉 Rails 3,但这肯定适用于 Rails 2。可能需要进行一些调整。

提供您的 User 模型会有所帮助,但我假设它类似于:一个 User belongs_to :school,一个 School 有一个名为 password 的字段。在你的用户模型中,你可以有类似的东西:

validates_associated :school
attr_accessible :school_password

def validate_on_create
  unless self.school_password == school.password
    errors.add :school_password, "incorrect password, please try again"
  end
end

然后你可以在表单中有一个选择框,比如

form_for @user do |user|
  user.select :school...
  user.password_field :school_password
end
于 2010-03-20T03:27:31.713 回答