日期无法更新,但更新时返回true(Rails ActiveRecord)

时间:2017-12-07 10:48:50

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-5

我有一个名为user的Rails模型,它的生日字段在Postgres中有类型日期。

我的第一个问题是我不确定如何更新用户的价值。如果我传入像" 10/10/2080"这样的字符串,它就不会更新。

第二个问题是即使没有更新生日,Rails也会为User.update(user_params)操作返回true

我的两个问题:

  1. 如何更新日期字段?
  2. 如果传入错误的日期,如何确保rails抛出错误?
  3. 如何更新日期字段?

    从下面的控制器更新方法。脚手架相当标准。

      # PATCH/PUT /users/1
      # PATCH/PUT /users/1.json
      def update
        respond_to do |format|
          puts(user_params)
          if @user.update(user_params)
            format.html { redirect_to @user, notice: 'User was successfully updated.' }
            format.json { render :show, status: :ok, location: @user }
          else
            format.html { render :edit }
            format.json { render json: @user.errors, status: :unprocessable_entity }
          end
        end
      end
    

    编辑:参数:

      def user_params
        params.require(:user)
              .permit(:points, :payment_option, :first_name, :last_name,
                      :payment_email, :phone_number, :facebook_id, :profile_pic_url,
                      :locale, :timezone, :gender, :email, :country, :city,
                      :age_group, :birthday, :employment_status, :occupation,
                      :education_level, :income_bracket)
      end
    

    Rails日志(请注意,我在更新语句后添加了puts(user_params)。

    Started PATCH "/api/v1/users/1" for 127.0.0.1 at 2017-12-07 19:16:37 +0800
    Processing by UsersController#update as JSON
      Parameters: {"user"=>{"birthday"=>"12dsafkljfsldk"}, "id"=>"1"}
      User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
    Can't verify CSRF token authenticity.
    {"birthday"=>"10/10/1900"}
       (0.2ms)  BEGIN
       (0.1ms)  COMMIT
      Rendering users/show.json.jbuilder
      Rendered users/_user.json.jbuilder (0.6ms)
      Rendered users/show.json.jbuilder (1.6ms)
    Completed 200 OK in 31ms (Views: 5.9ms | ActiveRecord: 3.1ms)
    

    我希望在保存之前我可以使用before_update将日期字符串解析为Date对象,但它看起来不像self.birthday甚至出现在模型中。

1 个答案:

答案 0 :(得分:1)

将此行放在 ApplicationController

 protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

如果它不起作用那么。尝试跳过动作

skip_before_action :verify_authenticity_token