0

我在视图页面中的代码(views/session/new.html.erb):

< %= form_for(:session, :url => sessions_path) do |f| %>

          <%= f.label :email, 'Username'%>
          <%= f.text_field :email %>

          <%= f.label :password %>
          <%= f.password_field :password %>

          <%= f.submit  'Login'%>
          <%= link_to 'Forgot Your Password?', new_password_reset_path >
< % end %>

我已经在我的模型文件中编写了正确的验证代码。但我希望在提交时,验证错误应该在字段旁边弹出,而不是在页面顶部。

提前致谢 !

4

3 回答 3

1

如果您倾向于使用 Rails 的内置服务器端验证,您可以检查是否存在验证错误,如果存在则打印它们:

<%= form_for(:session, :url => sessions_path) do |f| %>

  <%= f.label :email, 'Username'%>
  <%= f.text_field :email %>
  <% if f.object.errors[:email] %>
    <%= f.object.errors[:email].join(", ") %>
  <% end %>

  <%= f.label :password %>
  <%= f.password_field :password %>
  <% if f.object.errors[:password] %>
    <%= f.object.errors[:password].join(", ") %>
  <% end %>

  <%= f.submit 'Login'%>
  <%= link_to 'Forgot Your Password?', new_password_reset_path >

<% end %>

注意几点:

首先,因为您传递的是一个符号,而不是表单中的一个对象,所以您需要form_for通过调用从块内访问对象的属性f.object

其次,由于某些字段可能会产生多个验证错误,因此您需要按顺序将它们打印出来。使用 Ruby 的join方法可以帮助您以连贯的方式连接它们。

更新

如果您希望错误直接呈现在相应的文本字段旁边,则需要应用一些 CSS。显然,建议为此使用样式表,但为了简单起见,这里有一个如何使用内联样式呈现的示例:

<%= f.text_field :email, :address, :style => "display: inline-block; float: left;" %>
<% if f.object.errors[:email] %>
  <span style="display: inline-block; float: left;">
    <%= f.object.errors[:email].join(", ") %>
  </span>
<% end %>
<div style="clear: left;"></div>
于 2013-09-09T21:55:42.453 回答
1

我会用这样的东西:

<%= form_for(:session, :url => sessions_path) do |f| %>
  <%= f.label :email, 'Username' %>
  <%= f.text_field :email %>
  <%= f.object.errors[:email].to_sentence if f.object.errors[:email] %>
<% end %>

我想你会弄清楚其余的。

于 2013-09-09T21:57:58.240 回答
0

errors您可以使用散列访问不同模型属性的错误消息的值,例如errors[:some_attribute_name]. 只要您的自定义验证器将错误消息存储在正确的模型属性中,您就可以执行类似的操作。

< %= form_for(:session, :url => sessions_path) do |f| %>
  <%= f.label :email, 'Username'%>
  <%= f.text_field :email %>
  <%= f.object.errors[:email] %>

  <%= f.label :password %>
  <%= f.password_field :password %>
  <%= f.object.errors[:password] %>

  <%= f.submit  'Login'%>
  <%= link_to 'Forgot Your Password?', new_password_reset_path >
< % end %>

我会让你担心错误是如何在表单和其他东西旁边显示的。:)

于 2013-09-09T21:54:19.390 回答