【问题标题】:Update Devise user field via jQuery partial form通过 jQuery 部分表单更新设计用户字段
【发布时间】:2016-04-22 15:17:49
【问题描述】:

我是一个真正的 Rails 初学者,正在尝试构建一个小应用程序。所以我得到了 rails 4.2.5 和 Devise 用于我的用户身份验证。我在用户模型中添加了两个额外的字段(用户名、城市)。一切正常。

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

现在我不确定如何实现这一目标以及要走的路。我只需要一个小指南来帮助我完成这项工作!因为默认情况下设计不生成控制器并且不使用正常路径,所以我对 Rails 的小经验有点迷茫。

提前非常感谢您! :)

【问题讨论】:

  • 你能展示你目前的部分代码吗?是否仅在用户登录时显示?还有运行良好的代码 - 你如何更新用户名,城市?

标签: jquery ruby-on-rails ajax devise


【解决方案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. 根据从设计控制器继承的控制器创建:

    app/controllers/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,您的视图将是:

app/views/registrations/update_city.js.erb

    <!-- Your javascript here -->

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

  1. 配置路由:

设计范围:用户做 发布“/users/:id/update_city”=>“custom_registrations#update_city 结束

  1. 根据控制器创建

    app/controllers/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,您的视图将是:

    app/views/custom_registrations/update_city.js.erb

    <!-- Your javascript here -->
    

2 解决方案类似,但在如何自定义设计方面有所不同,解决方案 #2 不涉及设计默认控制器,但会有 2 个与更新用户内容相关的控制器。取决于您的系统,这些只是我的建议!欢迎大家发表意见。

【讨论】:

  • 多么棒的答案啊!!这正是我需要走得更远的地方。我将首先尝试您的第二个解决方案,然后我会给您反馈!再次感谢伙计!
  • 嗨@hieu-pham!我尝试了您的第一个解决方案。现在我的表单出现以下错误:undefined method user_path' for #:0x007fcc91d6bd60>` 我的表单部分如下所示:&lt;div class="citychange"&gt; &lt;p&gt; &lt;%= simple_form_for @user, remote: true do |f| %&gt; &lt;%= f.input :city, placeholder: 'Deine Stadt' %&gt; &lt;%= f.button :submit %&gt; &lt;% end %&gt; &lt;/p&gt; &lt;/div&gt;
  • 嘿,只需在表单中添加 url 选项,它就像simple_form_for @user, remote: true, url: user_update_city_path(@user)
  • 嗨嗨,谢谢你的帮助!但现在我得到这个错误:undefined method 'user_update_city_path' for #&lt;#&lt;Class:0x007fcc9555dd40&gt;:0x007fcc95767280&gt; 我的 rake 路线看起来像这样:Imgur
【解决方案2】:

所以,非常感谢 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 %>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多