为什么在我的帐户更新失败时,我会将我重定向到/ users而不是/ users / edit? [英] Why does devise me redirect me to /users instead of /users/edit when my account update fails?

查看:226
本文介绍了为什么在我的帐户更新失败时,我会将我重定向到/ users而不是/ users / edit?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题是这样的:



如果我使用默认注册控制器,我被重定向:




  • / users / edit ,当用户更新成功

  • 更新失败 / users / edit / users



因为默认的控制器更新操作如下所示:

 如果resource_updated 
sign_in resource_name,resource,bypass: true
respond_with资源,位置:after_update_path_for(资源)
else
clean_up_passwords资源
respond_with资源
结束

after_update_path_for 默认设置为



如果更新失败,我会收到设计错误消息和 hasError div包装器,错误



在我的注册控制器编辑动作我将值归因于变量 @ myvar = {2,3}



此变量用于 registrationrations_edit 视图



无论何时用户更新失败,我收到错误没有方法.each为nil 为我的 @myvar



我应该如何声明我的视图变量,即使在更新表单失败时也可以访问?



我试过:



强制控制器重定向到编辑查看无论什么:

 如果resource_updated 
sign_in resource_name,resource,bypass:true
redirect_to edit_user_registration_path
else
clean_up_passwords资源
redirect_to edit_user_registration_path
end

由于设计验证不再工作



编辑-------



我的注册e dit:

  def edit 
@images = Dir.glob(public / assets / images / users / current_user.id} / med / *)
end

我的观点:

 <%img_paths = Array.new%> 
<%@ images.each do | image | %GT;
<%img_paths.push([
'',
/assets/images/users/#{current_user.id}/original/#{image.split('/') .last},
{'data-img-src'=>/ assets / images / users /#{current_user.id} / med /#{image.split('/' }
])%>
<%end%>

编辑-----



注册控制器:

  class Users :: RegistrationsController< Devise :: RegistrationsController 

def edit
@images = Dir.glob(public / assets / images / users /#{current_user.id} / med / *)
end

def update
如果params [:image_file_path]
ff = File.open(public /+ params [:image_file_path])
resource.image = ff
resource.save!
end
self.resource = resource_class.to_adapter.get!(send(:current _#{resource_name})to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?( unconfirmed_email)

resource_updated = resource.update_with_password(account_update_params)
生成资源如果block_given?
如果resource_updated
如果is_flashing_format?
flash_key = update_needs_confirmation?(resource,prev_unconfirmed_email)?
:update_needs_confirmation:更新
set_flash_message:notice,flash_key
end
sign_in resource_name,resource,bypass:true
respond_with资源,位置:after_update_path_for(资源)
else
clean_up_passwords资源
respond_with资源
结束
结束


私人

def sign_up_params
params.require(:user).permit(:first_name,:last_name,:email,:password,:password_confirmation,:phone,:image,:address,,birthday)
end

def account_update_params
params.require(:user).permit(:first_name,:last_name,:email,:password,:password_confirmation,:phone,:image,:image_file_path,:address,,birthday)
end

protected

def update_resource(resource,params)
resource.update_without_password(params)
end

def after_update_path_for(resource)
edit_user_reg istration_path
end

end


解决方案

您可以尝试这样做; -

  def update 
如果params [:image_file_path]
ff = File.open(public /+ params [:image_file_path])
resource.image = ff
resource.save!
end
self.resource = resource_class.to_adapter.get!(send(:current _#{resource_name})to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?( unconfirmed_email)

resource_updated = resource.update_with_password(account_update_params)
生成资源如果block_given?
如果resource_updated
如果is_flashing_format?
flash_key = update_needs_confirmation?(resource,prev_unconfirmed_email)?
:update_needs_confirmation:更新
set_flash_message:notice,flash_key
end
sign_in resource_name,resource,bypass:true
respond_with资源,位置:after_update_path_for(资源)
else
@images = Dir.glob(public / assets / images / users /#{current_user.id} / med / *)

clean_up_passwords资源

respond_with资源
end
end


The problem is like this:

If I use the default registration controller I get redirected:

  • /users/edit to root when user update succeeds
  • /users/edit to /users when update fails

Because the default controller update action looks like this:

if resource_updated
  sign_in resource_name, resource, bypass: true
  respond_with resource, location: after_update_path_for(resource)
else
  clean_up_passwords resource
  respond_with resource
end

after_update_path_for is set by default to root

If update fails I get the devise error messages and hasError div wrappers for the fields with error

In my registrations controller in the edit action I attribute values to a variable @myvar={2, 3}

This variable is used in the registrations_edit view

Whenever user update fails I get error no method .each for nil for my @myvar

How should I declare my view variables such that they are accessible even when update form fails?!

I have tried:

Forcing the controller to redirect to edit view no matter what:

if resource_updated
  sign_in resource_name, resource, bypass: true
  redirect_to edit_user_registration_path
else
  clean_up_passwords resource
  redirect_to edit_user_registration_path
end

This created problems because devise validations do not work anymore

Edit-------

My registrations edit:

def edit
  @images = Dir.glob("public/assets/images/users/#{current_user.id}/med/*")
end

My view:

<% img_paths = Array.new %>
  <% @images.each do |image| %>
  <%img_paths.push([
    '',
    "/assets/images/users/#{current_user.id}/original/#{image.split('/').last}",
    {'data-img-src'=>"/assets/images/users/#{current_user.id}/med/#{image.split('/').last}"}
    ])%>
  <% end %>

Edit-----

Registration controller:

class Users::RegistrationsController < Devise::RegistrationsController

  def edit
    @images = Dir.glob("public/assets/images/users/#{current_user.id}/med/*")
  end

  def update
    if params[:image_file_path]
      ff = File.open("public/"+params[:image_file_path])
      resource.image = ff
      resource.save!
    end
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    resource_updated = resource.update_with_password(account_update_params)
    yield resource if block_given?
    if resource_updated
      if is_flashing_format?
        flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
          :update_needs_confirmation : :updated
        set_flash_message :notice, flash_key
      end
      sign_in resource_name, resource, bypass: true
      respond_with resource, location: after_update_path_for(resource)
    else
      clean_up_passwords resource
      respond_with resource
    end
  end


  private

  def sign_up_params
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :telephone, :image, :address, :birthday)
  end

  def account_update_params
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :telephone, :image, :image_file_path, :address, :birthday)
  end

  protected 

  def update_resource(resource, params)
    resource.update_without_password(params)
  end

  def after_update_path_for(resource)
    edit_user_registration_path
  end

end

解决方案

You can try this;-

def update
    if params[:image_file_path]
      ff = File.open("public/"+params[:image_file_path])
      resource.image = ff
      resource.save!
    end
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    resource_updated = resource.update_with_password(account_update_params)
    yield resource if block_given?
    if resource_updated
      if is_flashing_format?
        flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
          :update_needs_confirmation : :updated
        set_flash_message :notice, flash_key
      end
      sign_in resource_name, resource, bypass: true
      respond_with resource, location: after_update_path_for(resource)
    else
    @images = Dir.glob("public/assets/images/users/#{current_user.id}/med/*")

      clean_up_passwords resource

      respond_with resource
    end
  end

这篇关于为什么在我的帐户更新失败时,我会将我重定向到/ users而不是/ users / edit?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆