0

首先我要说的是,我主要是一名前端设计师/开发人员,对 MVC 几乎没有经验。

我想使用 TowerJS 创建一个登录表单。我的大部分应用程序都是开箱即用的。我有一个名为“用户”的模型:

class App.User extends Tower.Model
  @field "email", type: "String"
  @field "userName", type: "String"
  @field "password", type: "String"
  @field "active", type: "Boolean", default: -> true

  @validates "userName", presence: true
  @validates "email", presence: true, format: /\w+@\w+.com/
  @validates "password", presence: true

  @timestamps()

对于“新”用户视图,我包括“表单”部分:

formFor @user, (f) ->
  f.fieldset (fields) ->
    fields.field "email", as: "string"
    fields.field "userName", as: "string"
    fields.field "password", as: "string"
    fields.field "active", as: "string"
  f.fieldset (fields) ->
    fields.submit "Submit"

如果我为我的登录表单使用“表单”部分,它将包含我不想要的字段(例如“活动”)。如果我使用一个名为“登录”的新部分:

formFor @user, (f) ->
  f.fieldset (fields) ->
    fields.field "email", as: "string"
    fields.field "password", as: "string"
  f.fieldset (fields) ->
    fields.submit "Submit"

然后表单不会呈现,因为似乎 Tower 期待User表单中的所有字段,因为它被传递了@user。这真的归结为我对如何渲染模型缺乏高层次的理解。我认为呈现此登录表单的两个选项是:

  1. 完全使用“表单”部分,并分别通过 css/back-end-js 隐藏/忽略不相关的字段或...
  2. 创建某种只包含我关心的登录字段(电子邮件、密码)的新模型,然后formFor在该模型上使用。这对我来说似乎很愚蠢,因为我正在处理用户,所以我直觉上觉得我应该使用该User模型。

也许答案在于创建一个Session模型,但我不确定所有这些部分如何在 TowerJS 中协同工作。需要明确的是,问题是:使用 TowerJS 呈现登录表单的正确方法是什么?

4

2 回答 2

1

尝试这个:

formFor @user, (f) ->
  f.fieldset (fields) ->
    fields.field 'email', as: 'string'
    fields.field 'userName', as: 'hidden'
    fields.field 'password', as: 'string'
    fields.field 'active', as: 'hidden'
  f.fieldset (fields) ->
    fields.submit 'Submit'

此外,根据文档中的样式指南,您应该尽可能使用单引号。

于 2012-11-08T14:36:01.923 回答
0
  1. 在 app/views/users 中创建一个名为 _login.coffee 的新文件,其中只包含您想要的字段。像这样:

    formFor @user, (f) ->
      f.fieldset (fields) ->
        fields.field "email", as: "string"
        fields.field "password", as: "string"
      f.fieldset (fields) ->
        fields.submit "Submit"
    
  2. 编辑文件 app/views/users/new.coffee 以使partial "form"现在读取的行变为partial "login".

现在您的视图应该正确呈现。当然,您现在将密码存储为明文等,但那是另一回事了……

于 2012-05-10T17:41:22.437 回答