注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 在服务器系统Windows 20..
 帮助
2009-07-01 17:41:42



2009-06-25 09:53:11



2009-06-22 14:50:07



2009-06-03 21:30:36



2009-04-15 19:36:50



2009-03-30 12:29:21



2009-03-25 15:43:05
先放个效果图上来看看:

下面来说明如何用rails+jquery实现这样的注册表单的ajax数据验证:

基本的注册,登录模块使用restful_authentication插件生成.

在注册页面,也就是sessions/new.html.erb中

<%content_for "head" do %>
  <%= stylesheet_link_tag "users/new"  %>

  <%= javascript_include_tag "jquery/users/register","jquery/users/jquery.validate" %>
  <script type="text/javascript">
      jQuery.validator.setDefaults({
          debug: true,
          success: "valid"
      });;
  </script>



<%end%>


<fieldset id="ologin"><legend>Register</legend>
  <div class="box">
    <%= error_messages_for :user %>
    <% form_for :user, :url => users_path, :html=>{:id=>"signupform"} do |f| -%>
      <table>
        <tr>
          
            <td><label for="login"><span>Login</span></label></td>
            <td><%= f.text_field :login %></td>
            <td class="status"></td>
        </tr>
        <tr>
          <td><label for="email"><span>Email</span></label></td>
          <td><%= f.text_field :email %></td>
          <td class="status"></td>
          
        </tr>
        <tr>
          <td><label for="password"><span>Password</span></label></td>
          <td><%= f.password_field :password %></td>
          <td class="status"></td>
        </tr>
        <tr>
          <td><label for="password_confirmation"><span>Confirm Password</span></label></td>
          <td><%= f.password_field :password_confirmation %></td>
          <td class="status"></td>
        </tr>
      </table>
      <div class="spacer"><%= submit_tag 'signup', :class=>"butt"%></div>
    
    <% end -%>
            
  </div>
</fieldset>



里面为了排版的整齐,我对表单用了table格式.

这里用到了三个js文件:jquery.js, jquery.validate.js, register.js

jquery.js和jquery.validate.js可以到jquery网站上下载.

register.js是自定义的jquery代码:

register.js:
$(document).ready(function(){
 
    $("#signupform").validate({
        rules: {
            "user[login]": {
                required: true,
                minlength:5,
                remote: {
                   data: {
                        user_name: function(){
                            return $('#user_login').val();
                        }
                    },
                    url: "users/",
                    type: "get"
                   
                }

            },
           
            "user[password]":{
                required: true,
                minlength:6
            },
           
            "user[password_confirmation]": {
                required: true,
                minlength: 5,
                equalTo: "#user_password"

            },
           
            "user[email]":{
                required: true,
                email: true
            }
        },
        messages: {
                     "user[login]": {
                required: "Enter a username",
                minlength: jQuery.format("Enter at least {0} characters"),
                remote: "Already in use"
            },
           
            "user[password]":{
               required: "Provide a password",

                minlength: jQuery.format("Enter at least {0} characters")

            },
           
            "user[password_confirm]": {
                required: "Repeat your password",
                minlength: jQuery.format("Enter at least {0} characters"),
                equalTo: "Enter the same password as above"
            },

           
            "user[email]":{
              required: "Please enter a valid email address",
              minlength: "Please enter a valid email address"

            }
        },
        errorPlacement: function(error, element) {
           
                error.appendTo( element.parent().next() );

        },
        // specifying a submitHandler prevents the default submit, good for the demo
        submitHandler: function(form) {
            alert("submitted!");
                        form.submit();
        },
        // set this class to error-labels to indicate valid fields
        success: function(label) {
            // set &nbsp; as text for IE
            label.html("&nbsp;").addClass("checked");
        }
       
    });
   
           
});

这是jquery.validate这个插件的方法.

这段代码可以分成这么几个部分

$("#signupform").validate({

        rules: {

            //对需要验证数据添加各种规则

        },

messages: {

           //对未通过验证的数据对应显示的消息

        },success: function(label) {

            //数据成功通过验证之后,焦点转移后的动作

        },errorPlacement: function(error, element) {

           

           //设置消息显示的位置



        },
submitHandler: function(form) {

            //当表单符合所有验证规则之后,点击"submit"之后的动作

        },});

下面对这几个部分分别来进行说明:
rules: {

            //对需要验证数据添加各种规则

        },
jquery.validate提供了很多验证的方法,具体内容可以参考API

比较常用的就是required()和remote了,required()方法就跟rails model里的validates_presence_of方法一样,验证数据非空.

这里拿用户名验证来说明它的用法:
"user[login]": { 
                required: true,
                minlength:5,
                remote: {
                   data: {
                        user_name: function(){
                            return $('#user_login').val();
                        }
                    },
                    url: "users/",
                    type: "get"
                   
                }

            },
下面这个是rails呈递的html代码:
<input id="user_login" name="user[login]" size="30" type="text" />


注意,在写数据项验证规则时,要使用input标签的name属性,譬如这里
"user[login]"
remote是向server端发送ajax请求,要求从server端收到一个json数据
数据格式是key,value.譬如对于一个用户名为abc的数据,将它发到server端之后,
如果abc为合法数据,那么server端应该返回一个"abc",true这样格式的数据.反之,如果不合法,就返回
"abc",false.

那么remote内部,有三个参数,url指明server的地址, type指明http动作,data是传递的数据内容
data: {

              user_name: function(){

              return $('#user_login').val();

           }

       },

       url: "users/",

       type: "get"

}

这么写,我就将dom id为user_login的输入框内的数据传递给了users控制器,
方法为get,很明显在RESTful的架构中,这是传递到了users/index方法
(不过不知道为什么会传递两个相同的值user[login]="val"和user_name="val")

那么在index方法中:

def index
@user=User.find_by_login(params[:user_name])
if @user
json="\"#{params[:user_name]}\",false"
else
json="\"#{params[:user_name]}\",true"
end

respond_to do |format|
format.js {render :text=>json}
end
end
(这段代码写的比较恶心..不过凑乎能用)


这样就完成了这个数据项验证的ajax请求..其他的数据项基本上都是js式的验证了.
比较简单就不再详述了.






[/img]..



2009-03-24 11:47:45



2009-03-19 15:36:07



2009-03-18 15:52:01



2009-03-15 19:47:10



2009-03-10 09:19:14



2009-03-09 20:32:23
1NF:
1NF比较简单:意思是说某个数据项不能再分(原子性)譬如下面这样的关系不能存在:
 

 
解决方法也很简单,拆成两个数据项:

 
2NF.当且仅当实体E是1NF,且每一个非键属性完全依赖主键(没有不完全依赖)时,则称实体E是2NF。
 
意思就是说这种情况(居多):
多对多的中间表中:
 
譬如学生选课,中间表SC(学号,课程号,成绩,学分)这样的表就不满足2NF了。
 
因为这个表中,(学号,课程号)是主键。这个主键确定成绩,而对于学分来说,课程号->学分。所以,学分对主键是部分依赖。
 
所以要符合2NF就要拆分成两个关系:
SC(学号,课程号,成绩) 和C(课程号,学分)
 
不满足2NF会发生的问题:
a. 数据冗余,显而易见,当很多学生选了一门课之后,那个学分项会相应的重复
b.更新异常,当需要调整某门课的学分时,对应的数据都要更新。还可能会发生同一门课程存储的学分不同的情况(因为修改的是若干项,而不是一项)。
c.插入异常,如果新开一门课程,当没人选修的时候,没有学号关键字,学分无法存入
d.删除异常,如果学生结业了,从当前数据库中清除选修记录,某些课程新生还没选修,那么这门课程的学分记录也会被删除掉。
 
 
 
3NF.当且仅当实体E满足2NF的情况下:且E中没有非主属性传递依赖于码时,称实体E是3NF。
譬如这样的关系:
学生(学号,姓名,系号,系名,系地址)主键学号决定了其他的各个属性,所以满足2NF,但这个关系会有大量的数据冗余,学生所在系的几个属性:系号、系名、系地址会重复存储,在插入和删除、修改时也会产生类似于上面2NF那个例子中的情况。
造成这种情况的原因就是关系中存在传递依赖,就是说学号->系号,而系号->学号,系号->系地址,因此关键字学号对系地址的函数决定是通过传递依赖学号->系号来实现的,也就是说学号不直接决定非主属性系地址。
解决目的:每个关系模式中不能留有传递依赖
 
解决方法:拆分成两个关系学生(学号,姓名,系号),系(系号,系名,系地址)
注意:在学生这个关系中,不能没有系号这个关键字,它是外键。否则两个关系会失去联系。[/img]..



2009-03-09 13:25:44



2009-03-09 09:29:08



2009-03-04 20:54:24



2009-02-21 15:48:54



2009-02-21 09:54:52



2009-02-21 09:37:38



2009-02-20 16:56:26



2009-02-20 15:51:24



2009-02-20 11:30:31



2009-02-20 11:14:09



2009-02-20 10:05:58



2009-02-20 09:52:20



 <<   1   2   3   4   5   >>   页数 ( 1/11 )