我想创建一个用户注册表单,其中用户勾选一些未连接到模型的框。
例如,可能存在'条款&条件的框,我不希望在用户模型中有一个布尔字段说'勾选条款&条件'。相反,我想在其他地方创建一个记录(如交易),记录他们接受T& Cs的日期/时间。
另一个例子可能是某些偏好,他们表示我会稍后使用并暂时保留在会话中,例如“记住我”。
我可以将这些类型的字段与常规表单助手混合使用。使用formtastic时,我怎么能做上面的任何一个例子?它有点必须将传统的轨道标签与可爱的清洁形式代码混合在一起。
答案 0 :(得分:1)
您可以在模型中创建任意数量的虚拟属性,这些属性不一定需要绑定到数据库列。将attr_accessor:terms_and_conditions添加到您的用户模型将使这个“字段”可用于formtastic - 即使它不是数据库字段。您可以像任何其他字段一样对其进行验证,也可以创建自己的setter方法,以便在其他位置创建记录,如果这就是您所需要的。
答案 1 :(得分:1)
我倾向于不同意将attr_accessors用于特定于操作的条目元素的方法。如果需要记录Ts& Cs然后这是有意义的,但有时您需要的数据实际上与模型无关,并且仅与手头的特定操作相关,例如“执行操作时执行一些重量级操作”。
假设您有一个注册表单,并且您没有使用OAuth,并且您可以选择在注册时指定Twitter用户名和密码。这很好:
<%= form.input :twitter_username %>
<%= form.input :twitter_password, :as => :password %>
但是下面的这一点让我感到困惑 - 在这种情况下它就像形式一样,实际上正在夺走已经存在的东西。有没有办法添加params [:your-object],同时仍然可以形成所有可爱的布局内容?
怎么样:
class User < ActiveRecord::Base
...
#I don't want this here. Its only for UserController#create.
#attr_accessor :tweet_when_signed_up
...
end
和
<%= form.input :tweet_when_signed_up, :as => :checkbox, :param_only => true %>
param_only
是我提出的建议。它说'这甚至不是一个短暂的财产。它只是为了这个动作。
class UserController < ActionController::Base
...
def create
if params[:tweet_when_signed_up] # haven't done this yet -- == 1 or !.nil?
Tweeter.tweet( ... )
end
@user = User.create( params[:user] )
end
执行此操作的能力可能就在那里 - 有没有人知道如何有效地完成我认为上面的好主意?
谢谢!
答案 2 :(得分:0)
相反,我想创建一条记录 其他地方(如交易) 记录了他们的日期/时间 接受了T&amp; Cs。
使用bensie描述的attr_accessor将字段与formtastic集成。
Formtastic是关于视图逻辑的,而关系是更多的模型逻辑。不要担心在表单中创建相关记录。相反,在模型中使用类似before_update和after_save的回调以确保已创建相关记录。