我正在关注客户端评估的rails cast 263。我有代码,虽然它没有验证我的错误。错误仅在提交表单后显示。
application.html.erb:
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= javascript_include_tag :defaults, "rails.validations" %>
<%= csrf_meta_tags %>
client_side_validations.rb:
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
unless html_tag =~ /^<label/
%{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
else
%{<div class="field_with_errors">#{html_tag}</div>}.html_safe
end
end
form.html.erb:
<%= form_for @user, :validate => true do |f| %>
<% if @user.errors.any? %>
<div class="error_messages">
<h2>Form is invalid</h2>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :email %><br/>
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %><br/>
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :username %><br/>
<%= f.text_field :username %>
<div class="field">
<%= f.label :zip_code %><br/>
<%= f.text_field :zip_code %>
</div>
</div>
的application.js:
//= require jquery
//= require jquery.ui.all
//= require jquery_ujs
//= require jquery.magnific-popup.js
//= require jquery.purr
//= require rails.validations
//= require best_in_place
//= require_tree .
答案 0 :(得分:3)
原始建议:在application.js链接到JS。
而不是从rails.validations.js
链接到application.html.erb
:
<%= javascript_include_tag :defaults, "rails.validations" %>
您可能希望在app/assets/javascripts/application.js
文件中执行此操作:
//= require rails.validations
这就是我连接其他JavaScript文件的方式。
我对Rails 2了解不多,但我认为Rails 3有一个转变,所以现在application.html.erb
用于链接到application.js
,然后所有其他JS文件都被链接从那里。看起来:default
可能无法正常使用。 RailsCasts非常有用,但几年前创建的一些剧集的代码示例在最新版本的Rails中已经发生了变化。
编辑1:确保将rails.validations.js安装到app / assets / javascripts中。
在RailsCast中,rails g client_side_validations:install
命令将rails.validations.js
放入项目中。显然这并不总是有效,您可以致电rails g client_side_validations:copy_assets
将其放入app/assets/javascripts
(参见:Can't include js file for client slide validation)。
编辑2:在Rails 4中,修复兼容性错误。
看起来client_side_validations在Rails 4中不起作用,并且不再维护gem(参见:https://github.com/bcardarella/client_side_validations)。
在Rails 3中,在action_view\helpers\form_helper.rb
中,apply_form_for_options!
方法是:
def apply_form_for_options!(object_or_array, options)
在Rails 4中,它是:
def apply_form_for_options!(record, object, options)
如果查看client_side_validations代码,其版本为:
def apply_form_for_options!(object_or_array, options)
super
options[:html][:validate] = true if options[:validate]
end
匹配Rails 3定义。我们只得到两个参数,但后来我们调用super
,因为Rails 4需要三个参数。
如果您感到勇敢,可以分叉client_side_validations gem并解决这些Rails-4兼容性问题。但是我怀疑可能有很多部分需要更新,因为这个gem必须与FormHelper紧密集成。
很抱歉,没有立即解决您的问题。祝你好运!