【问题标题】:Rails - Devise - edit_user_registration_pathRails - 设计 - edit_user_registration_path
【发布时间】:2010-11-07 00:30:21
【问题描述】:

在 Rails 中,有路径 edit_user_registration_path 允许用户编辑他们的个人资料。

我正在设置我自己的帐户控制,以便为用户提供更好的用户界面来编辑他们的个人资料等。这些信息被路由到 /account/profile、/account/notices 等......

问题是这个 URL,/users/edit 仍然有效,并将用户带到 DEVISE 编辑页面。

我怎样才能让它总是进入新的编辑页面/account/profile

谢谢

【问题讨论】:

  • 为什么不修改Devise页面的UI呢?
  • 有人告诉我这不是你应该做的。我想打破它。个人资料照片编辑页面、取消帐户页面、密码页面等。喜欢 Twitter

标签: ruby-on-rails ruby-on-rails-3 devise


【解决方案1】:

这可能是设计中最糟糕的部分是制作自定义编辑配置文件路径。原因是当您尝试更新资源时,它会将您送回编辑用户的默认路径,即如果您遇到错误。

我建议您保留默认用户/编辑路径,然后编辑关联,而不是实际资源。否则,您将不得不深入研究 gem 并重写用户编辑方式的路径。

这就是我所做的。

在你的用户模型user.rb

has_one :profile
has_many :notices

然后您可以拥有一个 noticesprofiles 控制器,您可以在其中编辑它们而不是用户或 resource,这是您使用设计助手制作的,这会使自定义变得更加困难。为这些表单创建一个 hidden_​​field f.hidden_field :user_id, :value => current_user.id,它会在您创建它们并更新它们等时保存用户...

【讨论】:

  • 感谢 Sam,但我无法按照上述操作。在配置文件仅包含设计信息之前,我不需要配置文件关联。我做什么用户有一个个人资料照片编辑页面,取消帐户页面,密码页面等。像 Twitter 但不明白如何连接点,从控制器到视图,如果有错误,返回控制器。或许您有任何为用户密码(当前、新、新验证)执行此操作的示例吗?
  • 并非如此..
  • 很有趣。并且您可以使用 flash 在该设置页面上显示错误?如何?谷歌设计小组告诉我不要这样做,所以 IDK...
  • 是的,这可能不是最好的方法,但是如果您将属性附加到用户模型,您总是需要输入当前密码来更新更改。
  • 此解决方案是否需要从用户表中分离出通知和配置文件?目前我已经在我的用户模型中定义了所有这些。
【解决方案2】:

从最新的 Devise 版本(特别是 this commit)开始,您现在可以通过 path_names 为编辑配置文件操作指定自定义路径:

devise_for :users, path_names: { edit: 'profile' }

【讨论】:

    【解决方案3】:

    更简单的方法是创建一个 ProfilesController,并在您的路由中定义“resource :profile”。然后,您只需定义“编辑”和“更新”方法即可。

    我没有比基础知识更进一步,但我真的没有看到缺点,与这里提供的任何东西相比,它真的很简单。

    【讨论】:

      【解决方案4】:

      解决方案:

      def update
          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)
      
          if update_resource(resource, account_update_params)
            yield resource if block_given?
            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
      
      #Add a conditional redirect depending on where the controller was called from
            if URI(request.referer).path == '/users/edit'
              respond_with resource
            else
              redirect_to after_update_path_for(resource), :flash => { :alert => "Please enter your password" }
            end
      
      
          end
        end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 2016-03-06
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        相关资源
        最近更新 更多