Rails AJAX请求控制器方法然后调用javascript函数

时间:2018-05-11 22:18:30

标签: javascript jquery ruby-on-rails ruby ajax

我已经查看了几十个堆栈溢出帖子,并且没有找到可行的解决方案,这就是为什么我要联系一个记录良好的用例。

我有一个应该这样做的按钮。

  • 单击时,调用自定义控制器方法来更新模型并执行其他操作
  • 调用javascript函数更新页面而不重新加载(ajax)

现在,我能够调用自定义控制器方法的唯一方法是通过这种方式感觉非常hacky。我已经把它剥离到尽可能简单。

的routes.rb

match 'admin/:id/toggleAdmin' => 'admin#toggleAdmin', via: [:patch, :put], as: :toggleAdmin

list.html.erb

<td><%= link_to "Toggle Admin", toggleAdmin_path(id: user.id), method: :patch %></td>

admin_controller.rb

class AdminController < ApplicationController

  def toggleAdmin
    idToToggle = User.find(params[:id]).id
    if idToToggle == current_user.id
      redirect_to admin_list_path, danger: "You tried to make yourself a normal user! Don't do that!"
    else
      User.find(params[:id]).updateToAdmin()
      redirect_to admin_list_path, info: "The user with an ID of #{idToToggle} has had their admin attribute toggled!"
    end
  end  

当切换管理员时,我想要做的不是重新加载页面,而是使用一些javascript来重写dom的那一部分。

有什么更好的方法可以解决这个问题?

以下是我已经尝试过的各种资源中的一小部分。

感谢您的帮助。

---编辑以获取更多信息。

使用干净的rails应用程序我现在能够更干净地调用控制器方法但是我没有得到ajax请求来更新页面以显示操作已完成。 (我期待布尔值更改和闪存)。以下是相关代码:

users.js

$("#edit-form").html("<%= j render partial: 'form', locals: { user: @user } %>")

_form.html.erb

<%= form_for user do |form| %>
  <%= user.admin %>
<% end %>
<%= link_to "Toggle Admin", toggle_admin_user_path(user), method: :put, remote: true %>

edit.html.erb

<h1>Editing User</h1>

<div id="edit-form">
  <%= render partial: 'form', locals: { user: @user } %>
</div>

<%= link_to 'Show', @user %> |
<%= link_to 'Back', users_path %>

users_controller.rb请注意,我只包含了toggle_admin和其他一些方法,其余的只是脚手架。

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy, :toggle_admin]

  def toggle_admin
    if 1 == 1
      logger.info "This is from info"
      u = User.find(params[:id])
      u.admin = !(u.admin)
      u.save
      respond_to do |format|
        format.js { flash[:info] = "The user with an ID of #{@user.id} has had their admin attribute toggled!" }
      end
    else
      redirect_to admin_list_path, danger: "You tried to make yourself a normal user! Don't do that!"
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.fetch(:user, {})
    end
end

0 个答案:

没有答案