为什么在我的帐户更新失败时,我会将我重定向到/ users而不是/ users / edit? [英] Why does devise me redirect me to /users instead of /users/edit when my account update fails?
问题描述
问题是这样的:
如果我使用默认注册控制器,我被重定向:
- / 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屋!