无法将 post 保存到数据库

Cannot save a post to a database

我有一个活动应用程序,我在其中使用日历。我已经为 #save#load 数据创建了 2 个外部路由和控制器操作,并且我有 2 个模板。一个是 save.json.erb 另一个是 load.json.erb。现在,我已经硬编码了来自 load.json.erb 的负载数据,看起来像;

{"2015-05-06": {"available":"1",
                           "bind":0,
                           "info":"",
                           "notes":"",
                           "price":"20",
                           "promo":"",
                           "status":"available"
  },

"2015-05-07": {"available":"1",
                           "bind":0,
                           "info":"",
                           "notes":"",
                           "price":"20",
                           "promo":"",
                           "status":"available"
  }}

因此,它显示了日历上的硬编码数据。

我的问题是,当我按下提交时,它没有给出错误,但没有将它保存到数据库中。我也无法弄清楚强参数。我现在正在使用 permit! 来查看它是否保存到数据库中。也许我的事件模型及其列是错误的。因为我不知道它是什么 posts (integer, string etc..)

这是我的 events_controller

....
def load

  end

  def save
    #THIS IS WRONG I SHOULD PUT SMTH ELSE
    @event = Event.new
    @event.save

  end

 def event_params
      params.require(:event).permit!
    end

当我 select 来自日历的数据按下提交时它会发送这个;

HEADER:
    event_id:0
    event:{"2015-05-06":{"available":"1","bind":0,"info":"","notes":"","price":"20","promo":"","status":"available"},"2015-05-07":{"available":"1","bind":0,"info":"","notes":"","price":"20","promo":"","status":"available"},"2015-05-27":{"available":"1","bind":0,"info":"demo","notes":"demodemodemo","price":"15","promo":"2","status":"available"}}

同样来自日志;这个数据是 JSON 吗?还是我必须在某处使用 JSON.parse

Started POST "/events/save" for ::1 at 2015-05-02 18:39:42 +0300
Processing by EventsController#save as */* #HERE IT SENDS THE PARAMETERS, BUT I COULD NOT GET THEM
  Parameters: {"event_id"=>"0", "event"=>"{\"2015-05-06\":{\"available\":\"1\",\"bind\":0,\"info\":\"\",\"notes\":\"\",\"price\":\"20\",\"promo\":\"\",\"status\":\"available\"},\"2015-05-07\":{\"available\":\"1\",\"bind\":0,\"info\":\"\",\"notes\":\"\",\"price\":\"20\",\"promo\":\"\",\"status\":\"available\"},\"2015-05-27\":{\"available\":\"1\",\"bind\":0,\"info\":\"demo\",\"notes\":\"demodemodemo\",\"price\":\"15\",\"promo\":\"2\",\"status\":\"available\"}}"}
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "events" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2015-05-02 15:39:42.823906"], ["updated_at", "2015-05-02 15:39:42.823906"]]
   (2.4ms)  commit transaction
  Rendered events/save.json.erb (0.1ms)
Completed 200 OK in 21ms (Views: 12.9ms | ActiveRecord: 3.0ms)

当我尝试时;

def save

    @event = Event.new(event_params)
    @event.save

  end

def event_params
      params.require(:event).permit!
    end

它给出了 ;

的错误
NoMethodError in EventsController#save

undefined method `permit!' for #<String:0x007fcbb99d24c0>

所以我认为它是 posted 作为字符串而不是散列。

对我来说,它发送到数据库的数据有问题,或者数据库无法为这些数据配置。由于 #save 操作一直有 @events = Event.new 它在数据库中创建新事件并保存 it.So 我必须获取 POSTed 数据但我无法获取这些参数。我想我必须获取 POSTed 数据,并且使用 for 循环我必须获取这些数据并将其保存到数据库中。找不到办法。希望有人帮忙

这里是完整的 HEADER:

Cache-Control:no-cache
Connection:Keep-Alive
Content-Length:0
Content-Type:application/json; charset=utf-8
Date:Sat, 02 May 2015 18:42:54 GMT
Server:WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26)
Set-Cookie:_demo_session=Snh1Nm5CNWJzTHNITXp5SkRDejNmZzRXRkdoVm5SeEkwUW82WmE5QkFndThkeUdyTEdBK2s3ZVR1aEUxQXpGclpqR202WTIzSGkzNWtIQUdWZXFFeUtmSVpBbnZZNmJnN090YUxXS2c5eFFPVzZOaXJjTGJndGRsS0xBcUhaU0VlMFAvRVdtT05RMHpLcUYrSy9wSElnPT0tLUI2SWFiOHZXRlpqMmpteVloV3Zsb2c9PQ%3D%3D--3533fcf1e966b5c1e766dcc099caa6df4b5c284f; path=/; HttpOnly
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Request-Id:7863cf16-0162-4760-8719-d155202eca7a
X-Runtime:0.030455
X-Xss-Protection:1; mode=block
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:3126
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:_Paint_session=NXN5NVUvemhXcHF2UnF1ZlBXTHhtZVVWODlyVWFoL0tEWU9vWCtOYVp6ck9EUVF6OUs0WTJYV21yWW5VeVhqdndST2JUYTdCdnNnamNzZDJjQXFLNE1CYzlQT3dtcVJiRTJLcmlwaXR3aFdKZUZBVXN4VitWamMzaWdZUUtTQU1mcWhIRFg3SnJwQ2FBK1hmclZ3WmtiODRuTUpVRUVLKzYzQTNuUGxCTURYMHhKN3Z6eUZtbURLS2MybVlNejNoTmo5MVZteUQzcG8wTnB6WUFlR2pRK2UwSHFnUTVua0hUM0VzWitLUTdya1BXVVZ1eTVKUmNCR3pQaEh2djlpcFo3dFU1WmhZYlhSWS9wYTBVSHRTYXc9PS0tbDJHT3A3NVJ1Tm5OczVIREM2emNLQT09--f2703914b69129404c69d1d9dbb446fde16c6442; _Resim_session=cXQ5cEE5ZjFPNU1Jby9ZY0lKWis2TVY1NVlaN2dVZGtSaDdzc3B1QU9saS9yNXNUUHE5N2d1Ym1CZjcxYlNNZjAwbnhPNm9oeEN0aUpNUXZYMXM1Q2ZHWHJuZ3lhdjhxRmxteVR3ZXFvNHdxMFJZcXp6NWZMbk1qWVJyZG5GVFdBWVVtRkp5MHZsZWVNTzZ1aGs4ejAxUzFoZWE2VHVlWCtuWFBpclZnQU5GR2dzeUFZZFBWeEZaSCsxWUhHNmRkQVhwYk9uWW5oVjd4VVA5L2xvRzR3amt2RmE4VTdjUzRHRHQvRC80Rys0V0ZWQ2FCTW01cWtNQ2E2SHUwYWFFQ080VVJkUEduUWxpUjNaUkZldWZsOWc9PS0tcnM2M2UyVCttTEJBbW13SVJQN3RNQT09--3233372784be95cd2d6e2630f7e5e22c17eeff17; _Carrierwave_session=cE4vek43aGlxZ3BrSFNXWU1JaDZQekcxdlVVSnRzNFRMbGNXRGxjOGhNZ0hGNHRaSFpzODQ1YU95WXVnb1VKUlM3Y0xBVFBjYW1paG5FSTh5dVVzYm1LWXNHVXd2RGJnNktaZ0YxY1JtM25Rb1hLMkhUWm5XTElZS1JUejAxSmFvcnE3VzVXTVFoYmdPbTczOE02Wjk4N2hsaTJDRFdLY2pRc1NxYVRNVFBHdkFHbmEvb1U4aEN4T2FOVDZWZGlUMnpJMU0yNkdHNW1acVpYN3NzRkxwQkN2TzRzS0ZBNlMwMGtIMGJ5bWN2QVp5Q3cxQUNIVnExajFDSldsZWhJek1zUjJxVzJyRHRsUDBjQnJsdlB1RFE9PS0tSjViSGdocSs5blRLdTNnUk1GWk9qZz09--068ded1e78c2d70739361e662b995b5470a059c4; _raddit_session=Vy9USHZBa1FodGxON1BMOWFZOHBIazk3eWVSOXh0OW9yUjRmSjJ5Tmg1OXpsMnI2Tm5ZTGQwOHdEMVJnUWhFNG5jRVZEcVhLL3ZCSVdsM1g5S2FTMjYvZWo4U1ovT0xNdkZVT2dJS0VWTkRMcXdRQ0lzTlFRWC9EZ1ZxbDRtYmtLQ1dkZzM3THltSEFvdzJTN010MHVnYytJMzE1R2F0cUVkQlh2bERBRUM4c0NVNnFsTFdmbVB1cURJeDVHUkhKOWZUOG5pUlhFZkxOSkJ3c01uU2paTW50WXRrRW8zRmJtTTBrUm5GWlJvbz0tLUh4ckZqdnA3WGQzRjdmNnAzMXdMcmc9PQ%3D%3D--622d3f9adb9afb871e118d0715921aaf986f82d2; _Cal_session=cjRlSlc0Q2FITHJJTmlTbU5TZjk5aFNFaTczTHRQZW9TR0h1MG4xYVovZG9xaUxyNittWENjbXdib3FLc1J6cXh3dHA5YitaVkZYbFVtaFI2bGxUKzJyM1kvRzJlRFV4b0JibzJ1TTdQS0ZkdVE2eVJJSlZQVXY0Q0thS1NBRzhGUzlaQ1ZRaHppYzJES2V2eXRmVWtBPT0tLWEzVWFIcWl0WnJBRVdnanJ0em1Renc9PQ%3D%3D--03a65bd6c5338108d2d3db62295843f8b3e3eaaa; _fullcalendar_and_rails_example_session=M1h0eFJieVY1ek16OWRtR1JRUGc1eCtsdFZnTDdqWkd3NndWQTFuUzFKdHJpOHlRYSsweHZ6UGZubTV1eEdJZm14NVZxbE1IUHZzRG1id2NVeENERzFlaFF3NzFNWHk0RlltbS8yNmc2aEtnYjJDcGZmY3pZWG0vU0RsU29ST005NDVpdVpYSWtNTURkM3M2RmVvZU8vUStwdUxFNk1TaVJTRDY1Z2FKcEd4QkxZMlpGeUlsUGl5UlNCVWhPNk5qR082T25lZlZ4NkIxY012MjRJaVVTKzFqdUZFMUVjc1VxVnA0UXFwSVFEbW1acE9KMWw1N0xzQWJlYUd6R200Q1VCdkJjUWpTbElrbFhlZ2ZBdnY2WnB1NHdHU2tBQTlQandzekR5SmJkbnVhU08vNWpLNjFuY1UyVUxuZWt2ZWotLTY3TU9jZklCcVR6ZXZQRy9UUCtHTmc9PQ%3D%3D--9bcb70f5196a063e7915b11622953f7935d9166c; _takvim_session=WVJmQVpEbEJUOE9KeVdLK3ZyODRpejI0dzA2aWJPd2dqOGRCaysxOU5VT3lhVkNnNzNIZytvYlpqL2FRZGhTWXZFcWxLc3JYVmoyUVRibGFuelpCczl4eFVjaFVLdkZiRURpUC84cysyUldFbC9VT295SURnMkpDQnFtdldLdUhHeDhRL3NGOG90WS9mWUI1WitocndBPT0tLVp6Mk1VS2VaT0hmMGtwcnhNcnpYMkE9PQ%3D%3D--a215e9c8f635c5c638ccdcd55105c3bdc452760e; SQLiteManager_currentLangue=2; request_method=GET; _Last_session=VnErWEFwazE3dWFBdm94WUVhMXdYWFhKVnViUmtQWUFja0xENjNDTmYxWVAxbjVyVDZrK3pxRlVjUnp0MGQ3R240UWZSK2lNcld5bDVKM2ZYb3JwMTJ1QXpPa0p1cFJOYXFXUllIakVrdnBzVHh2V09YQlZGTHNjTWtNLzFDOXNTdUhYZGNXei80enRwclZkdzBCUzZFcUtEQVFqeDFock15anMrVnVIUHRRPS0tci9lSEMvNFBtVWJ5eW1BSTQ0VUpadz09--46ddca06b8e604506dcfff84e7cc8111c7a1b679; _demo_session=TzE2bi93R2E3ZXVNSHdkZ0MvVnRCTm5BeG1VQ0luMVQrWFJ5a1FhbTc4amNCSGFNazJYTVhVYlRxbEhGejlnREowTTJDVFByYkoveHRpeEx6SlZvRnpaQ3R3UEdWaVRlK25UK29SQmx5Nmplbk9Gb1NNZ0pYdm9PQ3FLeTFKZ25CdkF4USt0clpGN1dMUkxrekxTM3lRPT0tLTZoQ1F4UHg3VExsa3JaMWRxQ1IvTFE9PQ%3D%3D--a430ecd15a69103694b06ec430875e21b66f5e62
Host:localhost:3000
Origin:http://localhost:3000
Referer:http://localhost:3000/events
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
X-CSRF-Token:GT/gFRykJMorJu4yPLmLwwGz1EZIwlVSp8XWeO1SOvIVYITeJLAPa1YcYkJOswrkXqMUUFb/jk/DP8JtvLhQYQ==
X-Requested-With:XMLHttpRequest
Form Data
view source
view URL encoded
event_id:0
event:{"2015-05-06":{"available":"1","bind":0,"info":"","notes":"","price":"20","promo":"","status":"available"},"2015-05-07":{"available":"1","bind":0,"info":"","notes":"","price":"20","promo":"","status":"available"},"2015-05-13":{"available":"1","bind":0,"info":"","notes":"","price":"35","promo":"","status":"available"},"2015-05-14":{"available":"1","bind":0,"info":"","notes":"","price":"35","promo":"","status":"available"},"2015-05-15":{"available":"1","bind":0,"info":"","notes":"","price":"35","promo":"","status":"available"},"2015-05-16":{"available":"1","bind":0,"info":"","notes":"","price":"35","promo":"","status":"available"},"2015-05-17":{"available":"1","bind":0,"info":"","notes":"","price":"35","promo":"","status":"available"},"2015-05-20":{"available":"","bind":0,"info":"","notes":"","price":"","promo":"","status":"booked"},"2015-05-21":{"available":"","bind":0,"info":"","notes":"","price":"","promo":"","status":"booked"},"2015-05-22":{"available":"","bind":0,"info":"","notes":"","price":"","promo":"","status":"booked"},"2015-05-23":{"available":"","bind":0,"info":"","notes":"","price":"","promo":"","status":"booked"},"2015-05-24":{"available":"","bind":0,"info":"","notes":"","price":"","promo":"","status":"booked"},"2015-05-28":{"available":"1","bind":0,"info":"","notes":"","price":"25","promo":"","status":"available"},"2015-05-29":{"available":"1","bind":0,"info":"","notes":"","price":"25","promo":"","status":"available"},"2015-05-30":{"available":"1","bind":0,"info":"","notes":"","price":"25","promo":"","status":"available"},"2015-05-31":{"available":"1","bind":0,"info":"","notes":"","price":"25","promo":"","status":"available"}}

这是我的数据库架构;

ActiveRecord::Schema.define(version: 20150502145455) do

  create_table "events", force: :cascade do |t|
    t.string   "title"
    t.text     "description"
    t.datetime "start_time"
    t.datetime "end_time"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.string   "status"
    t.float    "price"
    t.float    "promo"
    t.integer  "available"
    t.text     "info"
    t.text     "notes"
    t.boolean  "bind"
    t.string   "time"
    t.string   "p"
    t.string   "event_id"
  end

end

编辑 1: 这是 Jquery 请求;

<script>
$(document).ready(function() {
    $('#backend').DOPBackendBookingCalendarPRO({

        'DataURL': '/events/load', #TO LOAD DATA
        'SaveURL': '/events/save'  #TO SAVE DATA
    });
});
</script>

我已经分享了 load.js.erb 文件,因为它现在是硬编码的。但是 save.js.erb 文件是空的。当我创建 url 时,rails 要求我定义模板。但是 #create 动作没有模板,对吧?。 此日历是为 php 编写的,但我正尝试在 RoR 上使用它。写它的人,我不知道为什么,他们定义了 2 post urls 一个用于检索数据 一个用于发送数据。通常,其中之一应该是get,对吗?这就是为什么我在 routes.rb 中创建了 2 post url。无论如何。如果你能帮忙,我可以发送日历项目我不知道如何,但你看到他们的 backend.js 文件。也许我应该在那里改变一些东西。谢谢

在 backend.js 文件的顶部,我有 ;

 Schedule = {},

后台..js文件中有这个函数加载数据

                 parseCalendarData:function(){
                        $.post(DataURL, {event_id:ID}, function(data){
                            console.log(typeof data); //THIS RETURNS OBJECT
                            if(typeof data === 'object') {
                        Schedule = data; 
                        }
                        else {
                            data = $.trim(data).replace(/\/gi, '');

                        if (data != ''){
                                Schedule = JSON.parse(data);
                            }
                        }
                            methods.initCalendar();
                        });
                    },

保存数据之前,这里是设置提交数据的代码,应该是问题所在;

setData:function(){// Set submited data.
                        var y, m, d, noDays, key,
                        startDate, sYear, sMonth, sDay,
                        endDate, eYear, eMonth, eDay,
                        fromMonth, toMonth, fromDay, toDay,
                        availableValue = $('#DOPBCP_available').val(),
                        bindValue = 0,
                        infoValue = $('#DOPBCP_info').val().replace(/\n/gi, '<br />'),
                        notesValue = $('#DOPBCP_notes').val().replace(/\n/gi, '<br />'),
                        priceValue = $('#DOPBCP_price').val() != undefined ? $('#DOPBCP_price').val():'',
                        promoValue = $('#DOPBCP_promo').val() != undefined ? $('#DOPBCP_promo').val():'',
                        statusValue = $('#DOPBCP_status').val();

                        startDate = dayStartSelection < dayEndSelection ? dayStartSelection.split('_')[1]:dayEndSelection.split('_')[1];
                        endDate = dayStartSelection < dayEndSelection ? dayEndSelection.split('_')[1]:dayStartSelection.split('_')[1];

                        sYear = parseInt(startDate.split('-')[0], 10);
                        sMonth = parseInt(startDate.split('-')[1], 10);
                        sDay = parseInt(startDate.split('-')[2], 10);

                        eYear = parseInt(endDate.split('-')[0], 10);
                        eMonth = parseInt(endDate.split('-')[1], 10);
                        eDay = parseInt(endDate.split('-')[2], 10);

                        if (Schedule[methods.previousDay(startDate)] != undefined){
                            if (Schedule[methods.previousDay(startDate)]['bind'] == 1){
                                Schedule[methods.previousDay(startDate)]['bind'] = 0;
                            }
                            else if (Schedule[methods.previousDay(startDate)]['bind'] == 2){
                                Schedule[methods.previousDay(startDate)]['bind'] = 3;
                            }
                        }

                        if (Schedule[methods.nextDay(endDate)] != undefined){
                            if (Schedule[methods.nextDay(endDate)]['bind'] == 2){
                                Schedule[methods.nextDay(endDate)]['bind'] = 1;
                            }
                            else if (Schedule[methods.nextDay(endDate)]['bind'] == 3){
                                Schedule[methods.nextDay(endDate)]['bind'] = 0;
                            }
                        }

                        for (y=sYear; y<=eYear; y++){
                            fromMonth = 1;

                            if (y == sYear){
                                fromMonth = sMonth;
                            }

                            toMonth = 12;

                            if (y == eYear){
                                toMonth = eMonth;
                            }

                            for (m=fromMonth; m<=toMonth; m++){
                                noDays = new Date(y, m, 0).getDate();
                                fromDay = 1;

                                if (y == sYear && m == sMonth){
                                    fromDay = sDay;
                                }

                                toDay = noDays;

                                if (y == eYear && m == eMonth){
                                    toDay = eDay;
                                }

                                for (d=fromDay; d<=toDay; d++){
                                    key = y+'-'+prototypes.timeLongItem(m)+'-'+prototypes.timeLongItem(d);

                                    if ($('#DOPBCP_group').is(':checked')){
                                        if (key == startDate){
                                            bindValue = 1;
                                        }
                                        else if (key == endDate){
                                            bindValue = 3;
                                        }
                                        else{
                                            bindValue = 2;
                                        }
                                    }
                                      //HERE IS THE PROBLEM I GUESS
                                    Schedule[key] = {"available": availableValue,
                                                     "bind": bindValue,
                                                     "info": infoValue,
                                                     "notes": notesValue,
                                                     "price": priceValue,
                                                     "promo": promoValue,
                                                     "status": statusValue};
                                }
                            }
                        }
                        methods.saveData();
                    },

最后是js文件中的保存功能;

                   saveData:function(){// Save data.
                        var today = new Date(),
                        dd = prototypes.timeLongItem(today.getDate()),
                        mm = prototypes.timeLongItem(today.getMonth()+1),
                        yyyy = today.getFullYear();

                        for (var day in Schedule){
                            if (day < yyyy+'-'+mm+'-'+dd){
                                delete Schedule[day];
                            }
                        }

                        methods.hideForm();
                        methods.generateCalendar(StartYear, dayStartSelectionCurrMonth);

                        $.post(SaveURL, {event_id:ID, event:JSON.stringify(Schedule)}, function(data){});
                    },

PS:我已经在事件控制器中试过了;

def save
    respond_to do |format|
      @event = Event.new(event_params)
      @event.save

      format.html
      format.json { render :json => @event, :content_type => 'application/json'  }
    end
  end

但是内容类型没有改变。

编辑 2:

很抱歉给你添了那么多麻烦,但我真的很努力学习。我已将 $.post 更改为 $.ajax,并按照您的建议更改了控制器。现在它尝试 post 数组,我打算遍历哈希以获取数据并保存它。正如你所说,我可以遍历 params[:event],因为它包含所有数据,对吧?因为多个数据它给出了一个 nil 错误,这就是为什么我想遍历它们(我改变了 #create 正如你所说);

NoMethodError in EventsController#create

undefined method `new' for nil:NilClass

我认为这是因为附表; (关键是 select 编辑日期)

Schedule[key]  =    {"date": key,
                     "available": availableValue,
                     "bind": bindValue,
                     "info": infoValue,
                     "notes": notesValue,
                     "price": priceValue,
                     "promo": promoValue,
                     "status": statusValue};
}

这是来自“网络”选项卡的内容;

Connection:Keep-Alive
Content-Length:94953
Content-Type:text/plain; charset=utf-8
Date:Sun, 03 May 2015 15:26:09 GMT
Server:WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26)
X-Request-Id:1d59e6cd-726f-4eb0-afdf-92205c8a0974
X-Runtime:0.390420
Request Headers
view source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:1687
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:_Paint_session=NXN5NVUvemhXcHF2UnF1ZlBXTHhtZVVWODlyVWFoL0tEWU9vWCtOYVp6ck9EUVF6OUs0WTJYV21yWW5VeVhqdndST2JUYTdCdnNnamNzZDJjQXFLNE1CYzlQT3dtcVJiRTJLcmlwaXR3aFdKZUZBVXN4VitWamMzaWdZUUtTQU1mcWhIRFg3SnJwQ2FBK1hmclZ3WmtiODRuTUpVRUVLKzYzQTNuUGxCTURYMHhKN3Z6eUZtbURLS2MybVlNejNoTmo5MVZteUQzcG8wTnB6WUFlR2pRK2UwSHFnUTVua0hUM0VzWitLUTdya1BXVVZ1eTVKUmNCR3pQaEh2djlpcFo3dFU1WmhZYlhSWS9wYTBVSHRTYXc9PS0tbDJHT3A3NVJ1Tm5OczVIREM2emNLQT09--f2703914b69129404c69d1d9dbb446fde16c6442; _Resim_session=cXQ5cEE5ZjFPNU1Jby9ZY0lKWis2TVY1NVlaN2dVZGtSaDdzc3B1QU9saS9yNXNUUHE5N2d1Ym1CZjcxYlNNZjAwbnhPNm9oeEN0aUpNUXZYMXM1Q2ZHWHJuZ3lhdjhxRmxteVR3ZXFvNHdxMFJZcXp6NWZMbk1qWVJyZG5GVFdBWVVtRkp5MHZsZWVNTzZ1aGs4ejAxUzFoZWE2VHVlWCtuWFBpclZnQU5GR2dzeUFZZFBWeEZaSCsxWUhHNmRkQVhwYk9uWW5oVjd4VVA5L2xvRzR3amt2RmE4VTdjUzRHRHQvRC80Rys0V0ZWQ2FCTW01cWtNQ2E2SHUwYWFFQ080VVJkUEduUWxpUjNaUkZldWZsOWc9PS0tcnM2M2UyVCttTEJBbW13SVJQN3RNQT09--3233372784be95cd2d6e2630f7e5e22c17eeff17; _Carrierwave_session=cE4vek43aGlxZ3BrSFNXWU1JaDZQekcxdlVVSnRzNFRMbGNXRGxjOGhNZ0hGNHRaSFpzODQ1YU95WXVnb1VKUlM3Y0xBVFBjYW1paG5FSTh5dVVzYm1LWXNHVXd2RGJnNktaZ0YxY1JtM25Rb1hLMkhUWm5XTElZS1JUejAxSmFvcnE3VzVXTVFoYmdPbTczOE02Wjk4N2hsaTJDRFdLY2pRc1NxYVRNVFBHdkFHbmEvb1U4aEN4T2FOVDZWZGlUMnpJMU0yNkdHNW1acVpYN3NzRkxwQkN2TzRzS0ZBNlMwMGtIMGJ5bWN2QVp5Q3cxQUNIVnExajFDSldsZWhJek1zUjJxVzJyRHRsUDBjQnJsdlB1RFE9PS0tSjViSGdocSs5blRLdTNnUk1GWk9qZz09--068ded1e78c2d70739361e662b995b5470a059c4; _raddit_session=Vy9USHZBa1FodGxON1BMOWFZOHBIazk3eWVSOXh0OW9yUjRmSjJ5Tmg1OXpsMnI2Tm5ZTGQwOHdEMVJnUWhFNG5jRVZEcVhLL3ZCSVdsM1g5S2FTMjYvZWo4U1ovT0xNdkZVT2dJS0VWTkRMcXdRQ0lzTlFRWC9EZ1ZxbDRtYmtLQ1dkZzM3THltSEFvdzJTN010MHVnYytJMzE1R2F0cUVkQlh2bERBRUM4c0NVNnFsTFdmbVB1cURJeDVHUkhKOWZUOG5pUlhFZkxOSkJ3c01uU2paTW50WXRrRW8zRmJtTTBrUm5GWlJvbz0tLUh4ckZqdnA3WGQzRjdmNnAzMXdMcmc9PQ%3D%3D--622d3f9adb9afb871e118d0715921aaf986f82d2; _Cal_session=cjRlSlc0Q2FITHJJTmlTbU5TZjk5aFNFaTczTHRQZW9TR0h1MG4xYVovZG9xaUxyNittWENjbXdib3FLc1J6cXh3dHA5YitaVkZYbFVtaFI2bGxUKzJyM1kvRzJlRFV4b0JibzJ1TTdQS0ZkdVE2eVJJSlZQVXY0Q0thS1NBRzhGUzlaQ1ZRaHppYzJES2V2eXRmVWtBPT0tLWEzVWFIcWl0WnJBRVdnanJ0em1Renc9PQ%3D%3D--03a65bd6c5338108d2d3db62295843f8b3e3eaaa; _fullcalendar_and_rails_example_session=M1h0eFJieVY1ek16OWRtR1JRUGc1eCtsdFZnTDdqWkd3NndWQTFuUzFKdHJpOHlRYSsweHZ6UGZubTV1eEdJZm14NVZxbE1IUHZzRG1id2NVeENERzFlaFF3NzFNWHk0RlltbS8yNmc2aEtnYjJDcGZmY3pZWG0vU0RsU29ST005NDVpdVpYSWtNTURkM3M2RmVvZU8vUStwdUxFNk1TaVJTRDY1Z2FKcEd4QkxZMlpGeUlsUGl5UlNCVWhPNk5qR082T25lZlZ4NkIxY012MjRJaVVTKzFqdUZFMUVjc1VxVnA0UXFwSVFEbW1acE9KMWw1N0xzQWJlYUd6R200Q1VCdkJjUWpTbElrbFhlZ2ZBdnY2WnB1NHdHU2tBQTlQandzekR5SmJkbnVhU08vNWpLNjFuY1UyVUxuZWt2ZWotLTY3TU9jZklCcVR6ZXZQRy9UUCtHTmc9PQ%3D%3D--9bcb70f5196a063e7915b11622953f7935d9166c; _takvim_session=WVJmQVpEbEJUOE9KeVdLK3ZyODRpejI0dzA2aWJPd2dqOGRCaysxOU5VT3lhVkNnNzNIZytvYlpqL2FRZGhTWXZFcWxLc3JYVmoyUVRibGFuelpCczl4eFVjaFVLdkZiRURpUC84cysyUldFbC9VT295SURnMkpDQnFtdldLdUhHeDhRL3NGOG90WS9mWUI1WitocndBPT0tLVp6Mk1VS2VaT0hmMGtwcnhNcnpYMkE9PQ%3D%3D--a215e9c8f635c5c638ccdcd55105c3bdc452760e; SQLiteManager_currentLangue=2; request_method=GET; _Last_session=VnErWEFwazE3dWFBdm94WUVhMXdYWFhKVnViUmtQWUFja0xENjNDTmYxWVAxbjVyVDZrK3pxRlVjUnp0MGQ3R240UWZSK2lNcld5bDVKM2ZYb3JwMTJ1QXpPa0p1cFJOYXFXUllIakVrdnBzVHh2V09YQlZGTHNjTWtNLzFDOXNTdUhYZGNXei80enRwclZkdzBCUzZFcUtEQVFqeDFock15anMrVnVIUHRRPS0tci9lSEMvNFBtVWJ5eW1BSTQ0VUpadz09--46ddca06b8e604506dcfff84e7cc8111c7a1b679; _demo_session=R1dIMnpjMU1BTkszczFzZTR2Zmk3cFMyUVU2Yk12eEwyZ2poR2RWUzhQWEtPbEM5UkMrQXRJb21oc1grWkFNNlpVM2VwMElvMnI1YUN2UlFVeXR2KytqYzJyN3AxeS9lM3gxVlNhLysxQzNLMklQOGszdUZBaEREMGQwZVMzc09BNFVndjRZaGQzY25KZGwrR0wyME5nPT0tLUEreS9acGZTWUhzdXdOc0hrVW5WYVE9PQ%3D%3D--9a636d832705858099e968c44c959b12980b6e99
Host:localhost:3000
Origin:http://localhost:3000
Referer:http://localhost:3000/events
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
X-CSRF-Token:BaHKI75O/nhl2kbiQDxSvJeZHiUAlTttTPGd0b/usf4J/q7ohlrV2RjgypIyNtObyIneMx6o4HAoC4nE7gTbbQ==
X-Requested-With:XMLHttpRequest
Form Data
view source
view URL encoded
event[2015-05-06][available]:1
event[2015-05-06][bind]:0
event[2015-05-06][info]:
event[2015-05-06][notes]:
event[2015-05-06][price]:20
event[2015-05-06][promo]:
event[2015-05-06][status]:available
event[2015-05-07][available]:1
event[2015-05-07][bind]:0
event[2015-05-07][info]:
event[2015-05-07][notes]:
event[2015-05-07][price]:20
event[2015-05-07][promo]:
event[2015-05-07][status]:available
event[2015-05-20][date]:2015-05-20
event[2015-05-20][available]:1
event[2015-05-20][bind]:0
event[2015-05-20][info]:
event[2015-05-20][notes]:
event[2015-05-20][price]:
event[2015-05-20][promo]:
event[2015-05-20][status]:available
event[2015-05-21][date]:2015-05-21
event[2015-05-21][available]:1
event[2015-05-21][bind]:0
event[2015-05-21][info]:
event[2015-05-21][notes]:
event[2015-05-21][price]:
event[2015-05-21][promo]:
event[2015-05-21][status]:available
event[2015-05-22][date]:2015-05-22
event[2015-05-22][available]:1
event[2015-05-22][bind]:0
event[2015-05-22][info]:
event[2015-05-22][notes]:
event[2015-05-22][price]:
event[2015-05-22][promo]:
event[2015-05-22][status]:available
event[2015-05-23][date]:2015-05-23
event[2015-05-23][available]:1
event[2015-05-23][bind]:0
event[2015-05-23][info]:
event[2015-05-23][notes]:
event[2015-05-23][price]:
event[2015-05-23][promo]:
event[2015-05-23][status]:available

编辑 3:

h = {"event"=>{"2015-05-06"=>{"available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"20", "promo"=>"", "status"=>"available"}, "2015-05-07"=>{"available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"20", "promo"=>"", "status"=>"available"}, "2015-05-18"=>{"date"=>"2015-05-18", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}, "2015-05-19"=>{"date"=>"2015-05-19", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}, "2015-05-20"=>{"date"=>"2015-05-20", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}, "2015-05-21"=>{"date"=>"2015-05-21", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}, "2015-05-22"=>{"date"=>"2015-05-22", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}, "2015-05-23"=>{"date"=>"2015-05-23", "available"=>"1", "bind"=>"0", "info"=>"", "notes"=>"", "price"=>"30", "promo"=>"", "status"=>"available"}}}


h.each do |key, value|
  puts key
  value.each do |key2, value2|
    puts key2
    value2.each do |k, v|
    puts k
    puts v
    end
  end
end

类似代码的东西可以很好地获取键和值,但是我不知道如果我把它放到 controller.Then 中是否可行,我应该将它保存到数据库中。我当然认为必须有更简单的方法。但是我依赖于那个人写的日历js代码。再次抱歉要求太多。如果您能指导我,我将不胜感激。再次感谢

在我的控制器#create action 中,我可以迭代键和值; 现在我必须弄清楚如何保存它们

def create
 h = params[:event] 
    h.each do |key, value|
      puts key
      value.each do |key2, value2|
        puts key2
        puts value2
      end
    end
end

您没有详细说明您实际上是如何发送 JSON 请求的,但是有两件事出错了:

您的保存操作需要一个带有键事件的散列:

{
  event: {
    title: "foo"
    # more attributes ...
  }
}

但是您正试图同时发送多个日期的参数。

event:{ 
 "2015-05-06": {"available":"1","bind":0,"info":"","notes":"","price":"20","promo":"","status":"available"}
 #... more events
}

你发送的请求也有错误的`Content-Type

您的请求已发送:

 Content-Type: application/x-www-form-urlencoded; charset=UTF-8

不是:

Content-Type: application/json; charset=utf-8;

differences in application/json and application/x-www-form-urlencoded

为响应问题的编辑而添加:

使用 jQuery.ajax 而不是 jQuery.post,它将为您将数据字符串化 - 这样 jQuery 将处理没有原生 JSON 的浏览器支持。

$.ajax(SaveURL, {
  method: 'POST',
  data: { event: Schedule },
  dataType: 'json'
});

现在您正在发送正确的请求类型 jQuery 会将 post 数据合并到 params

但这仍然没有解决 Schedule 包含多个事件的属性的问题。我将从创建一个接受单个事件参数的简单路由开始。在 Rails 约定中,我们称该操作为 create 而不是 save

   class EventsController
     # ... 

     # POST /events
     def create
        @event.new(params[:event])
        if (@event.save) 
           render json: @event, status: :created
        else
           # ... what do we do if validation fails?
        end
     end

     # ...  

     private 

     def create_params
        params.permit(:event).allow(:available, :bind, :info, :notes, :price, :promo, :status)
     end  
   end

您可以通过将此添加到您的 config/routes.rb:

来为事件生成一整套 restful 路线
resources :events

生成以下路由:

    Prefix Verb   URI Pattern                Controller#Action
    events GET    /events(.:format)          events#index
           POST   /events(.:format)          events#create
 new_event GET    /events/new(.:format)      events#new
edit_event GET    /events/:id/edit(.:format) events#edit
     event GET    /events/:id(.:format)      events#show
           PATCH  /events/:id(.:format)      events#update
           PUT    /events/:id(.:format)      events#update
           DELETE /events/:id(.:format)      events#destroy

以你的技术水平,我不会费心去尝试创建一个控制器动作来一次创建多个事件,我不打算在这里指导如何去做,因为它会很长。