使用带有单独用户配置文件的设备(用户#show)和profile_update(用户#update),路由问题?

时间:2015-01-10 17:35:37

标签: ruby-on-rails devise

我很困惑。我正在使用devise gem进行用户身份验证。如何在保持user_profile.html.erb管理用户密码的同时,如何正确设置单独的user_profile_update.html.erbdevise/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

这是当前的设置:

  1. app/views/users/registrations文件夹中是新的并编辑哪个 被路由到devise/registrations#newdevise/registrations#edit。当新用户注册时,我们只收集 - 每个设计 - 他们的:电子邮件和:密码。他们的:id由数据库分配。注册后,我们会要求用户转到user_update_profile.html.erb
  2. 来完成他们的个人资料
  3. 用户/控制器:

    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!我得到它之后我会重构 工作

  4. 表单顶部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;

  5. 在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'
    
  6. 我是否有简单的路由错误? (我怀疑它与users#showusers#update观点有关;但是,我不知道该尝试什么。)

    或者是我的问题设计?我是否需要创建一个单独的设计控制器,其范围为用户[https://github.com/plataformatec/devise#configuring-controllers]并创建范围块[https://github.com/plataformatec/devise#configuring-routes]。看到这个问题和优秀答案:Rails add new view to devise先谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

这是一个路由错误 - 我认为是由def updatedef user_profile_update之间的冲突造成的。