客户端验证未加载

时间:2013-11-19 17:44:53

标签: ruby-on-rails client-side-validation

我正在关注客户端评估的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 .

1 个答案:

答案 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紧密集成。

很抱歉,没有立即解决您的问题。祝你好运!