所以我正在为高中生构建一个rails应用程序,在创建用户时遇到了问题。
我希望学生只有在选择学校并正确输入学校密码后才能创建帐户。
这样做的最正确/最简单的方法是什么?我是否应该为用户创建一个看门人#他们必须首先传递的新动作,或者他们是否可以在同一页面上为学生提交表单。一个是常规用户名,电子邮件,密码使用:
form_for @user do
...
end
然后为高中/高中密码选择创建另一种形式。
理想情况下,控制器将能够获得高中形式的参数,验证这些参数,然后继续从用户参数创建用户。
这可以使用rails吗?
我的设置:Rails 3和Ruby 1.9.2dev
谢谢!
答案 0 :(得分: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]将代表学校名称/密码。
然后,您可以在创建用户之前验证正确的学校密码。
答案 1 :(得分:4)
jrallison关于fields_for
是正确的,但我建议考虑是否必须在同一表格上进行这两项工作。
您用学校名称和密码描述的内容听起来很像用户身份验证。它可能不是单个人意义上的“用户”,但在这种情况下,“用户”就是学校。也许你应该这样对待它:拥有一个单独的登录表单,如果成功就创建一个会话(以便他们不必在以后一遍又一遍地输入他们学校的密码),并执行标准的flash消息等等。他们失败了。
此时,您需要的表单是简单的单一模型。如果以后需要其他功能 还需要学校密码,那么您已经领先一步了。
答案 2 :(得分:0)
我不熟悉Rails 3,但这肯定适用于Rails 2.可能需要进行一些调整。
提供您的用户模型会有所帮助,但我会假设它类似于:用户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