我有应用程序轨道并使用带有Devise的client_side_validations gem来验证设计注册表格
// account.rb
has_one :user
validates :username, presence: true, uniqueness: true
// user.rb
belongs_to :account
validates :email, presence: true, uniqueness: true
// new.html.erb
<%= form_for(@user, :url => registration_path(resource_name), :validate => true) do |f| %>
<%= f.fields_for :account, :validate => true do |inner_form|%>
<div class="field">
<%= inner_form.label :username, "Username" %><br />
<%= inner_form.text_field :username %>
</div>
<% end %>
<div class="field">
<%= f.label :email, "Email" %>
<%= f.email_field :email %>
</div>
<div>
<%= f.submit "Sign up" %>
</div>
<% end %>
验证可以正常使用电子邮件字段,但用户名不起作用.. 帮帮我,,,谢谢
更新 ---验证展示,但这不是嵌套表格
更改:帐户为@account
<%= f.fields_for :account, :validate => true do |inner_form|%>
到
<%= f.fields_for @account, :validate => true do |inner_form|%>
提交时我收到错误 账户(#27129348)预计,获得ActiveSupport :: HashWithIndifferentAccess(#26695068)
当验证无效时,html代码
<input id="user_account_attributes_username" name="user[account_attributes][username]" size="30" type="text" data-validate="true">
验证工作
<input id="user_account_username" name="user[account][username]" size="30" type="text" data-validate="true">
问题
user_account_attributes_username
用户[account_attributes] [用户名]
工作
user_account_username
用户[帐户] [用户名]
答案 0 :(得分:2)
对于当前DavyJonesLocker/client_side_validations
版本(Rails 4.2),修复嵌套表单只是替换行(位于rails.validations.js
函数内的.coffee
或validateForm
):
name = name.replace(/\[[\da-z_]+\]\[(\w+)\]$/g, "[][$1]");
使用更好的正则表达式,这将消除[ids]
字符串中的每个[new_ids]
和name
。以下是jeroenj/client_side_validations
上提出的一个解决方案:
name = name.replace(/\[((?:new_)?\d+|[0-9a-f]{24})\]/g, "[]");
这很好(只要你有合理的属性名称),但可能有更好的方法来做到这一点。如果有人擅长编写JS regexp,请帮助改进它。我会在完成当前项目后立即尝试,但我绝对不是正则表达式。
在当前的client_side_validations
版本中,您必须注释掉if(...) { }
并提及所提到的regexp指令。这只是quickfix,if
可能在某些时候是必要的,但我还没有找到任何用法。
答案 1 :(得分:1)
我们找到了解决这个问题的分支。
我刚用这一行更新了我的Gemfile:
gem 'client_side_validations', github: "jeroenj/client_side_validations", :branch => "4-0-deeply-nested-forms"
希望能为你效劳