Ruby on rails 在控制器中获取参数,转换字符串类型,然后保存

Ruby on rails 在控制器中获取参数,转换字符串类型,然后保存,ruby-on-rails,controller,Ruby On Rails,Controller,我有一篇ajax帖子,用来创建一个新的会议。在保存之前,我想在控制器中将字符串meeting_time转换为datetime格式 我已经尝试过了,但它仍然可以节省会议时间: def create requestor = current_user @meeting_with_params = meeting_params @meeting_time = @meeting_with_params[:meeting_time] @meeting_time = @meeting_time.to_dat

我有一篇ajax帖子,用来创建一个新的
会议
。在保存之前,我想在控制器中将字符串meeting_time转换为datetime格式

我已经尝试过了,但它仍然可以节省会议时间:

def create

requestor = current_user
@meeting_with_params = meeting_params
@meeting_time = @meeting_with_params[:meeting_time]
@meeting_time = @meeting_time.to_datetime
@meeting_with_params[:meeting_time] = @meeting_time
#@meeting_with_params
@meeting = Meeting.new(@meeting_with_params)

respond_to do |format|
  if @meeting.save
    format.html { redirect_to home_url, notice: 'Your lex was successfully requested! Click Plan Meeting ' }
    format.json { render :show, status: :created, location: @meeting }
  else
    format.html { render :new }
    format.json { render json: @meeting.errors, status: :unprocessable_entity }
  end
end
end
正在传递的参数如下所示:

Started POST "/meetings" for 127.0.0.1 at 2016-10-31 11:45:44 -0400
Processing by MeetingsController#create as */*
  Parameters: {"meeting"=>{"requestor_id"=>"1", "requestee_id"=>"2", "meeting_time"=>"2016-10-18 22:10:00", "accepted"=>"false", "status"=>"Active", "location"=>"Black Forest Restaurant", "location_address"=>"733 Fulton St, Brooklyn, NY 11217"}}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (1.1ms)  INSERT INTO "meetings" ("requestor_id", "requestee_id", "meeting_time", "accepted", "location", "status", "location_address", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["requestor_id", 1], ["requestee_id", 2], ["meeting_time", "2016-10-18 22:10:00.000000"], ["accepted", "f"], ["location", "Black Forest Restaurant"], ["status", "Active"], ["location_address", "733 Fulton St, Brooklyn, NY 11217"], ["created_at", "2016-10-31 15:45:44.557266"], ["updated_at", "2016-10-31 15:45:44.557266"]]
以及.js文件中的ajax调用:

$.ajax({
                url: '/meetings',
                type: 'POST',
                data: {
                    meeting: {
                        requestor_id: currentUserId,
                        requestee_id: requesteeId,
                        meeting_time: rubyDateTime,
                        accepted: false,
                        status: "Active",
                        location: meetingLocation,
                        location_address: meetingAddress
                    }
                },
                success: function(result)   {
                    createNotification(currentUserId, "Your meeting was successfully requested.");
                    location.reload();
                },
                error: function(err)    {
                    console.log(err);
                }
            })
如何在创建控制器中提取会议时间,并在保存之前将其更改为datetime

谢谢

****更新 我知道它没有正确保存,因为我还有一种方法,可以将今天的日期与会议时间进行比较,如果已经过去了,可以做些什么。直接保存到数据库时,它会识别经过的时间。通过POST保存时,使用完全相同的字符串,因为它正在比较两种不同的类型。比较控制器:

def requestor_review_meeting
        @past_meetings = Meeting.where('meeting_time <= ? AND requestor_id= ? AND status = ? AND requestor_score < ?', DateTime.current, current_user, "Active", 1).order('meeting_time asc');
        render json: @past_meetings

end

看起来,你的代码看起来不错。如果您试图通过查询帖子来打印会议时间,那么它应该是datetime对象

更新 正如@Rocco所说,以下内容足以保存数据,因为Rails将从参数自动将日期字符串转换为日期

def create

requestor = current_user
@meeting_with_params = meeting_params
@meeting = Meeting.new(@meeting_with_params)

respond_to do |format|
  if @meeting.save
    format.html { redirect_to home_url, notice: 'Your lex was successfully requested! Click Plan Meeting ' }
    format.json { render :show, status: :created, location: @meeting }
  else
    format.html { render :new }
    format.json { render json: @meeting.errors, status: :unprocessable_entity }
  end
end
end

ActiveRecord自动类型转换所有输入,以便它们与数据库架构匹配。因此,即使允许您将
会议时间
保存为字符串,它也会在加载时将其转换为日期时间。如果您感兴趣,可以阅读更多

在保存之前,无需将datetime字符串转换为datetime,因为它将自动保存为datetime

Ex)

考虑第一个字段是用户名,第二个字段是DOB。第二个将自动解析为datetime

“1990-10-31”上方的第一个字符串被视为日期 第二个字符串“11:45:44”被视为时间和
第三个字符串“0000”表示时区

什么是会议时间db列类型?@Aleksey在数据库中,它是datetime。但是由于我只能通过ajax调用传递一个字符串,所以它当前正在接收一个字符串。我需要在保存之前转换为datetime。您当前的代码有什么问题?您是如何确保它仍然保存为数据库中的字符串的?我认为这只是表示问题。尝试找到post并在其上运行call
meeting\u time
方法。结果会是什么?@Aleksey我更新了我的答案,提供了更多信息,希望能有所帮助。谢谢我更新了我的问题,提供了更多关于如何知道日期未保存为正确类型的信息。希望这能有所帮助:/我更新了我的问题,提供了更多信息,说明为什么我发现它没有以正确的格式保存。谢谢通过你的帖子,我发现这是在节省时间,而不是约会时间。你能建议一种正确地保存为DateTime而不是time的方法吗?时间和日期时间类型都是相似的。如果它们是相同的,那么为什么查询只在保存为datetime类型而不是时间类型时才起作用?有没有办法指定类型必须是datetime,因为它在模式中被分类为datetime?这可能是一个时区问题。尝试从AJAX调用中始终以UTC格式发送日期,以便比较查询始终返回匹配的记录。
def create

requestor = current_user
@meeting_with_params = meeting_params
@meeting = Meeting.new(@meeting_with_params)

respond_to do |format|
  if @meeting.save
    format.html { redirect_to home_url, notice: 'Your lex was successfully requested! Click Plan Meeting ' }
    format.json { render :show, status: :created, location: @meeting }
  else
    format.html { render :new }
    format.json { render json: @meeting.errors, status: :unprocessable_entity }
  end
end
end
User.create('Test user', '1990-10-31 11:45:44 0000')