论坛首页 编程语言技术论坛

在Rails3时代js该怎么写?

浏览 16760 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-09-25  
actionpack-2.3.4/lib/action_controller/request_forgery_protection.rb # 87 行
 
    def verified_request?
        !protect_against_forgery?     ||
          request.method == :get      ||
          request.xhr?                ||
          !verifiable_request_format? ||
          form_authenticity_token == params[request_forgery_protection_token]
      end
1 请登录后投票
   发表时间:2009-09-25  
用Ruby on Rails没用视图的飘过~
0 请登录后投票
   发表时间:2009-09-27   最后修改:2009-09-27
rainchen 写道

在application.js 中加入:
$(function(){
  // set authenticity koen for Rails
  if(typeof AUTHENTICITY_TOKEN != 'undefined' && AUTHENTICITY_TOKEN != ''){
    $.ajaxSetup( {data: {authenticity_token: AUTHENTICITY_TOKEN}} );
  }

然后在使用特定ajax操作的时候,如下:
 $.ajax({
    type: "POST",
    url: "url",
    dataType: "json",
    data: "title=abc",
    success: function(data){                    
        // do something
    }
 });     
 

这里通过指定data向服务端发送额外数据会重写application.js中定义的data参数。 能否在ajaxSetup方法中获取特定ajax请求的options然后扩展之,像这样?但不行:

$.extends({ data: { authenticity_token: AUTHENTICITY_TOKEN }}, options);

现在遇到这个问题,请给个思路。谢谢!


0 请登录后投票
   发表时间:2009-09-27  
blablabla 写道
rainchen 写道

在application.js 中加入:
$(function(){
  // set authenticity koen for Rails
  if(typeof AUTHENTICITY_TOKEN != 'undefined' && AUTHENTICITY_TOKEN != ''){
    $.ajaxSetup( {data: {authenticity_token: AUTHENTICITY_TOKEN}} );
  }

然后在使用特定ajax操作的时候,如下:
 $.ajax({
    type: "POST",
    url: "url",
    dataType: "json",
    data: "title=abc",
    success: function(data){                    
        // do something
    }
 });     
 

这里通过指定data向服务端发送额外数据会重写application.js中定义的data参数。 能否在ajaxSetup方法中获取特定ajax请求的options然后扩展之,像这样?但不行:

$.extends({ data: { authenticity_token: AUTHENTICITY_TOKEN }}, options);

现在遇到这个问题,请给个思路。谢谢!




ajaxSetup看名字就知道是个全局的初始化作用,你要每次提交不同,可以利用另一个全局的ajax钩子
ajaxSend:
Attach a function to be executed before an AJAX request is sent. This is an Ajax Event.
具体查API:http://docs.jquery.com/Ajax/ajaxSend#callback
它有function (event, XMLHttpRequest, ajaxOptions) 这个三个参数,
你在这里扩展ajaxOptions即可,你不要用string的形式,用json object的方式即可:如:
data: {title:abc"}
只有同名的KEY才会覆盖值。
0 请登录后投票
   发表时间:2009-09-27   最后修改:2009-09-27
谢谢rainchen。总结一下,现在有两种方式:

第一种就是用json传参而不是用不科学的string,这样jquery会$.extend()之。

第二种利用另一个全局的ajax钩子,如下:
$(document).ajaxSend(function(event, request, settings) {
        if (typeof(AUTH_TOKEN) == "undefined" || AUTH_TOKEN == '' ) return;        
        settings.data = settings.data || "";        
        settings.data += (settings.data ? "&" : "") + 
                          "authenticity_token=" +   encodeURIComponent(AUTH_TOKEN);

 });



不过这种方法好像在用ajax不定义data参数的时候,服务器会500。貌似是字符串拼接出了问题....所有还是用json传参。。

参考的这里:http://polyrails.com/2008/11/11/steps-to-unobtrusive-rails-with-jquery

最后再次谢谢rainchen.



0 请登录后投票
   发表时间:2010-07-30  
jquery的live事件在IE有BUG

github上有人发一个解决的方法,我正好遇到这个问题,测试过可以用。

http://github.com/rails/jquery-ujs/issues#issue/8
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics