【问题标题】:How can validate params in the view?如何验证视图中的参数?
【发布时间】:2014-04-14 20:41:45
【问题描述】:

这是表格:

|policies|
  |id| |name| |date|
    1    ABC   2013-01-01 
    2    DEF   2013-01-21

这里是控制器:

class PolicyController < ApplicationController
   def index
     @policies = Policy.find(:all,:conditions=>['date BETWEEN ? AND ?',params[cam],params[:cam2] ])
   end
end

这是模型:

class Policy < ActiveRecord::Base
end 

这里是视图:

<% CalendarDateSelect.format=(:hyphen_ampm )%>
<% calendar_date_select_style "silver" %>
<% translation_calendar %>

<% form_tag :controller=>"policy",:action=>"index" do %>
  From: <%= calendar_date_select_tag  "cam", params[:cam]  %>

  To:   <%= calendar_date_select_tag  "cam2",params[:cam2] %>

  <%= submit_tag "Search", :name => nil %></p>
<% end %>

<% @policies.each |p| do %>
  <%= p.date %>
<% end %>      

在我的 2 个日历文本有值之前,如何阻止搜索按钮?

我试过了:

class Policy < ActiveRecord::Base
    validates_presence_of :cam
end

请有人可以帮助我,或者也许是一个javascript?

我将不胜感激。

这是朋友告诉我的:

 named_scope :by_calendar_date,lambda { |cam1, cam2| }  {
    if cam1.nil? && cam2.nil?
       scoped
    elsif cam1.nil?
       where("date < ?",cam2)
    elsif cam2.nil?
       where("date > ?", cam1)
    else
       where("date BETWEEN ? AND ?",cam1,cam2)
    end
}
   #this would perform the same functionality so both are not needed but just for edification
def self.by_calendar_date(cam1,cam2)
    if cam1.nil? && cam2.nil?
       scoped
    elsif cam1.nil?
       where("date < ?",cam2)
    elsif cam2.nil?
       where("date > ?", cam1)
    else
       where("date BETWEEN ? AND ?",cam1,cam2)
    end
end 

【问题讨论】:

  • 验证不应该发生在视图中,它应该发生在控制器中。
  • 哦,您正在寻找验证日历的技巧,如果它们没有值,则提交按钮将不起作用
  • 您的 lambda 不正确,它是一个块,因此应该在大括号之间和管道变量之后执行。我更新了我的答案,所以你可以看到。您不需要两种方法都选择 named_scope 或 self.by_calendar_date 方法。
  • @engineersmnky 我希望我的参数在点击搜索之前真的很有必要
  • 好的,在这种情况下使用下面列出的 jQuery 验证

标签: ruby-on-rails ruby calendar ruby-on-rails-2


【解决方案1】:

由于这是一项搜索功能,我认为您不需要验证您可以这样做

class Policy < ActiveRecord::Base
    named_scope :by_calendar_date,lambda{|cam1,cam2|
        if cam1.nil? && cam2.nil?
           {:conditions => {}}
        elsif cam1.nil?
           {:conditions => ["date < ?",cam2]}
        elsif cam2.nil?
           {:conditions => ["date > ?", cam1]}
        else
           {:conditions => ["date >= ? AND date <= ?",cam1,cam2]}
        end
   }     
end 

调用

def index
  @policies = Policy.by_calendar_date(params[:cam1],params[:cam2])
end

这样用户可以单独设置参数或根本不设置参数

【讨论】:

  • 只需将scope 替换为named_scope-&gt; 替换为lambda { |cam1, cam2| } 块以使其兼容....
  • @MrYoshiji 的回答也可以使用named_scopelambda,其中rails 3 简写为-&gt;(...)
  • 我编辑了帖子并写了Yoshiji先生写的但仍然无法正常工作
  • 我得到了 #<0x7f32999b29b8>
【解决方案2】:

看看这个小提琴...http://jsfiddle.net/qKG5F/641/

HTML

// note the change... I set the disabled property right away
<input type="submit" id="register" value="Register" disabled="disabled" />

JavaScript

(function() {
    $('form > input').keyup(function() {

        var empty = false;
        $('form > input').each(function() {
            if ($(this).val() == '') {
                empty = true;
            }
        });

        if (empty) {
            $('#register').attr('disabled', 'disabled'); // updated according to http://stackoverflow.com/questions/7637790/how-to-remove-disabled-attribute-with-jquery-ie
        } else {
            $('#register').removeAttr('disabled'); // updated according to http://stackoverflow.com/questions/7637790/how-to-remove-disabled-attribute-with-jquery-ie
        }
    });
})()

这样做的好处是,无论您的表单中有多少输入字段,如果至少有 1 个为空,它将始终禁用按钮。它还检查.keyup() 上的空虚,我认为这使它更便于使用。

我希望这会有所帮助。

【讨论】:

  • 你需要把这个jQuery代码翻译成Prototype代码
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多