我很困惑。我正在使用devise gem进行用户身份验证。如何在保持user_profile.html.erb
管理用户密码的同时,如何正确设置单独的user_profile_update.html.erb
和devise/registrations#edit
页面。当前用户配置文件视图正确呈现。但是,user_profile_update不会保存。我收到错误:没有路由匹配[PATCH]" / user / 1"。当我运行rake路线时,列出这些路线(两次!)。但是,虽然存在put和patch路由,但它们没有路径声明。
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
我得到了一个"形式中的第一个参数不能包含nil或为空#34;错误;但是,我通过明确地将用户声明为:
来移动它@user = User.find(:user => params[:id])
如果感兴趣:https://github.com/plataformatec/devise/issues/2451,请参阅此问题,了解为什么设计和表单存在问题。顺便提一下,"形式"只被调用一次 - 我通过帮助解决了另一个错误:form_for renders get rather than post, using rails
这是当前的设置:
app/views/users/registrations
文件夹中是新的并编辑哪个
被路由到devise/registrations#new
和
devise/registrations#edit
。当新用户注册时,我们只收集 - 每个设计 - 他们的:电子邮件和:密码。他们的:id由数据库分配。注册后,我们会要求用户转到user_update_profile.html.erb
用户/控制器:
def new
@user = User.new
end
def create
@user = User.new
@user.save
if user_signed_in?
@user = User.find(:user => params[:id])
@user.save
flash[:success] = "User Profile Updated!"
redirect_to user_profile_path
end
end
def user_profile
@user = User.find(:user => params[:id])
@user.save
if user_signed_in?
@user = current_use
@user.save
end
end
def update
@user = User.find(:user => params[:id])
@user.save
if user_signed_in?
@user = current_user
@user.save
end
end
def user_profile_update
@user = User.find(:user => params[:id])
@user.save
if user_signed_in?
@user = current_user
@user.save
end
end
那里可能还有一些额外的@user.save
!我得到它之后我会重构
工作
表单顶部user_profile_update.html.erb
:
<% if user_signed_in? %>
<div>
<div>
<%= form_for(@user, url: user_profile_update_path, html: { method: :patch })
do |f| %>
我已尝试同时使用&#39; put&#39;和&#39;补丁&#39;
在config / routes中:
#DEVISE
authenticated :user do
resources :user, only: [:user_profile_update, :user_profile, :destroy]
end
# USER
devise_for :users, :controllers => { :registrations => "users" }
resources :users, only: [:index, :create, :show, :update]
get 'user_profile' => 'users#user_profile'
match 'user_profile_update', to: 'users#update', via: 'patch'
我是否有简单的路由错误? (我怀疑它与users#show
和users#update
观点有关;但是,我不知道该尝试什么。)
或者是我的问题设计?我是否需要创建一个单独的设计控制器,其范围为用户[https://github.com/plataformatec/devise#configuring-controllers]并创建范围块[https://github.com/plataformatec/devise#configuring-routes]。看到这个问题和优秀答案:Rails add new view to devise先谢谢你的帮助!
答案 0 :(得分:0)
这是一个路由错误 - 我认为是由def update
和def user_profile_update
之间的冲突造成的。