【发布时间】:2018-10-22 09:08:34
【问题描述】:
我查看了数十篇堆栈溢出帖子,但没有找到可行的解决方案,这就是为什么我要寻求一个其他有据可查的用例。
我有一个按钮可以执行此操作。
- 点击后,调用自定义控制器方法来更新模型并执行其他操作
- 调用一个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 的那部分。
有什么更好的方法来解决这个问题?
这里只是我已经尝试过的各种资源中的一小部分。
- How to call a controller's method from a view?
- Can we call a Controller's method from a view (as we call from helper ideally)?
- Call controller method with rails-Ajax?
- https://www.reddit.com/r/rails/comments/7iyp6g/want_a_button_to_call_a_method_apparently_this_is/
- How do I call a JavaScript function from an html.erb
感谢您的帮助。
--- 编辑以获取更多信息。
使用干净的 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
【问题讨论】:
标签: javascript jquery ruby-on-rails ruby ajax