Formtastic和Formtaghelper

时间:2009-10-21 16:26:56

标签: ruby-on-rails forms webforms

我想创建一个用户注册表单,其中用户勾选一些未连接到模型的框。

例如,可能存在'条款&条件的框,我不希望在用户模型中有一个布尔字段说'勾选条款&条件'。相反,我想在其他地方创建一个记录(如交易),记录他们接受T& Cs的日期/时间。

另一个例子可能是某些偏好,他们表示我会稍后使用并暂时保留在会话中,例如“记住我”。

我可以将这些类型的字段与常规表单助手混合使用。使用formtastic时,我怎么能做上面的任何一个例子?它有点必须将传统的轨道标签与可爱的清洁形式代码混合在一起。

3 个答案:

答案 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的回调以确保已创建相关记录。