Search code examples
ruby-on-railsrubydevise

Rails Controller runs update function anyway even though the form submit returns devise error message and nothing updated


Environment:

rails 4.2.6
devise 4.1.1

I am using a rails app, and there is a form to update user's profile. By default, devise asks the user to input user's password to update the user's data. I have put the <%=devise_error_messages! %> in the form, of course there is a update function in the controller, which looks like

def update
  super
  @email = resource.email
  @event = resource.event
  @name = resource.name
  NoticeMailer.notice_confirm(@email, @name, @event).deliver_later
end

Here comes the problem. When I am editing the user's profile data, by default, devise asks the user to input the password to update the data and save it to the database. If I input the wrong password or leave the password field blank, and press the submi button(form.submit), there will be an error message, and I am still in the form. However even though there is an error message in the form, the update function in the controller still runs anyway. I think the logic is that the update function should not run if the update is failed.

Try01: Try to input the data without password. I use the method

protected 
  def resource_update(params, resource)
     resouce.update_without_password(params, resource)
  end

in the controller,but it threw error message.

Try02 I am thinking using ajax to catch the submit click action and pass the password field to backend to check password. however i don't know how to implement this.

Try03

I tried to put a after_update filter function to do the mail sending function. However the result is the same, the mail function is sending no matter what.

Any suggestion?


Solution

  • The correct update function in the controller:

    def update
      super
      @email = resource.email
      @event = resource.event
      @name = resource.name
      unless resource.errors.any?
        NoticeMailer.notice_confirm(@email, @name, @event).deliver_later
      end
    end
    

    Update02

    def update
      super
      NoticeMailer.notice_confirm(
       resource.email, resouce.name, resouce.event
      ).deliver_later unless resource.errors.any?
    end