[英]Ruby on Rails Custom Controller Action for Users Controller
處理版本:Ruby:3.0.2 Rails 6.1.4
我正在嘗試在“用戶”的視圖模板中放置一個按鈕,該按鈕會將 :mod 屬性設置為 false,而該按鈕只是“降級用戶”。
我使用輔助方法、demote_user 和一些變體讓它以某種方式工作
<% if logged_in? && current_user.admin? %>
<%= link_to "Demote User", user_path(@user), onclick: demote_user(@user), class: "btn btn-info" %>
<% end %>
我搞砸了,但是在嘗試將此方法移動到控制器中以獲得最佳實踐時它正在工作。 我不確定哪種格式有效,但我嘗試了很多,例如
:onclick => demote_user(@user)
onclick: 'demote_user(@user)'
onclick=demote_user(@user)
onclick='demote_user(@user)
等等。不知何故,它最終確實奏效了,但我破壞了它。 現在,每次我加載用戶頁面時,它只是執行 demote_user(@user) 甚至不需要單擊按鈕,因此刷新用戶頁面正在降級它們。
我現在正試圖通過在 UserController 中創建一個降級方法來正確執行此操作,但我不知道如何制作路由或使其正常工作。 到目前為止,我所有的路線都在使用資源,基本的新建、創建、銷毀等。
我一直在嘗試許多不同的路線,並查看格式,但沒有運氣,通常以: Routing Error No route matches [GET] "/demote.3"
我希望能夠避免使用 Javascript onClick 功能並使用控制器正確執行此操作,即使我記得如何使其工作,但我認為我的路線、視圖頁面或控制器不正確。 以下是每個文件的內容:
控制器
def demote
byebug
@user = User.find(params[:id])
@user.mod = false
redirect_to user_path(@user)
end
看法
div class="container text-center mt-4">
<% if logged_in? && current_user.admin? %>
<%= link_to "Demote User", demote_path(@user), class: "btn btn-info" %>
<% end %>
</div>
路線
Rails.application.routes.draw do
root 'pages#home'
get 'about', to: 'pages#about'
resources :articles
get 'signup', to: 'users#new'
resources :users, except: [:new]
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
resources :categories
post 'demote', to: 'users#demote'
end
到目前為止,我一直在學習一門課程,我已經掌握了其中的所有內容並添加了一些我自己的功能,但我仍然不太確定如何理解路線或它創建的路徑。
除了顯示、索引、創建、刪除、更新之外,我還想制作其他類似的自定義控制器功能,這些都是我真正了解如何構建的。 我什至不確定 POST 是否是路線中的正確調用。
resources :users do
patch :demote
end
<% if logged_in? && current_user.admin? %>
<%= button_to "Demote User", demote_user_path(@user), method: :patch %>
<% end %>
您可以使用link_to
代替button_to
,但您需要使用正確的method: :patch
或data: { turbo_method: :patch }
選項,具體取決於您的 Rails 版本,以使 javascript 驅動程序執行其詭計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.