通过jQuery partial form更新Devise用户字段

时间:2016-04-22 15:17:49

标签: jquery ruby-on-rails ajax devise

我是一个真正的铁杆初学者试图建立一个小应用程序。所以我得到了rails 4.2.5和Devise for User认证。我已经为用户模型添加了两个额外的字段(用户名,城市)。一切正常。

我在我的应用程序顶部得到了一个部分,通过单击每个页面上的按钮以jquery打开。这个部分应该包括一个输入字段,用户可以在其中编辑他的城市(通过AJAX?)。提交后,应更改城市并重新加载页面。

现在我不确定如何实现这一目标,以及将要采取的方法。我只需要一个小指南,帮助我完成这项工作!因为默认情况下设计并不会生成控制器并且不使用正常路径,所以我在轨道上的经验很少,我有点失落。

非常感谢您提前! :)

2 个答案:

答案 0 :(得分:1)

这里有2种解决方案,无论是否有自定义设备控制器都能正常工作:

解决方案#1:自定义设计控制器

  1. 配置路线:

    <强>的routes.rb

    devise_for :users, controllers: { registrations: 'registrations' }
    
    devise_scope :user do
     post "/users/:id/update_city" => "registrations#update_city"
    end
    
  2. 根据从设计控制器继承的控制器创建:

    应用/控制器/ registrations_controller.rb

    class RegistrationsController < Devise::RegistrationsController
      def update_city
        # Do your stuff
        # return json here, if return javascript, go to step #3
      end
    end
    
  3. 如果返回javascript,您的观点将是:

  4. 应用/视图/注册/ update_city.js.erb

        <!-- Your javascript here -->
    

    解决方案#2:创建一个新的控制器,不关心设计

    1. 配置路线:
    2. devise_scope:用户做   发布“/ users /:id / update_city”=&gt; “custom_registrations#update_city 端

      1. 根据控制器创建

        应用/控制器/ custom_registrations_controller.rb

        class CustomRegistrationsController < ApplicationController
          before_action :authenticate_user!
        
          def update_city
            # Do your stuff
            # return json here, if return javascript, go to step #3
          end
        end
        
      2. 如果返回javascript,您的观点将是:

        应用/视图/ custom_registrations / update_city.js.erb

        <!-- Your javascript here -->
        
      3. 2解决方案是一样的,但在如何定制设计方面有所不同,解决方案#2不接触设计默认控制器,但会有2个控制器与更新用户的东西有关。取决于你的系统,这些只是我的建议!欢迎任何评论。

答案 1 :(得分:0)

所以,非常感谢Hieu Pham!我想出了如何让它与你的步骤一起工作。但我不得不稍微修改它们,但现在它正在工作:)所以,这里是为了其他想知道的人:

<强>的routes.rb

devise_scope :user do
  patch "update/:id", to: "registrations#update_city", as: "update_city"
end

<强> registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController

  def update_city
    @user = current_user
    if @user.update_attributes(user_params)
      respond_to do |format|
        format.js {render inline: "location.reload();" }
      end
    else
      flash.now[:error] = "Could not save client"
    end
  end

  private

  def user_params
    params.require(:user).permit(:city)
  end

end

我的表单部分

<%= simple_form_for @user, url: update_city_path(@user), remote: true do |f| %>
  <%= f.input :city, placeholder: t('.yourcity') %>
  <%= f.button :submit, t('.submit') %>
<% end %>

现在它工作得很好:)我知道,我需要在保存时添加更好的响应,但那只是为了调试!