Ruby on Rails用户控制器的自定义控制器操作

发布于 2025-02-13 10:47:00 字数 1840 浏览 0 评论 0原文

在版本上工作: Ruby:3.0.2 Rails 6.1.4

我试图在“用户”的视图模板中放置一个按钮,该模板将设置为“ mod属性”为false,而该按钮只是“ Demote用户”。

我用助手方法,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中创建Demote方法来正确地做到这一点,但是我不知道如何制作路线或使其正常工作。到目前为止,我所有的路线一直在使用资源以及基本的新,创建,破坏等工作

。 没有路由匹配[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

课程,并且我已经钉上了所有内容,并且已经添加了一些自己的功能,但是我仍然不确定如何理解路线,或它创建的路径。

我想使其他类似的自定义控制器功能超出显示,索引,创建,删除,更新,这是我真正了解如何构建的。我什至不确定帖子是否是路线中的正确呼叫。

Working on versions:
Ruby: 3.0.2
Rails 6.1.4

I'm trying to put a button in my View template for "Users" that will set the :mod attribute to false, with the button just being "Demote User".

I had it working SOMEHOW using a helper method, demote_user, and some variation of

  <% if logged_in? && current_user.admin? %>
      <%= link_to "Demote User", user_path(@user), onclick: demote_user(@user), class: "btn btn-info" %>
  <% end %>

I messed up however it was working when trying to move this method into a controller for best practice. I'm not sure what format worked out, but I've tried many such as

 :onclick => demote_user(@user)
 onclick: 'demote_user(@user)'
 onclick=demote_user(@user)
 onclick='demote_user(@user)

and etc. Somehow, it did eventually work but I busted it. Now, every time I load the User's page, it's just executing demote_user(@user) without even needing to click the button, so refreshing a User's page is demoting them.

I am now trying to do this properly by creating a demote method in the UserController, but I have NO IDEA how to make the route, or make it work properly. Up until now, all my routes have been working using resources, and the basic new, create, destroy, etc.

I've been trying many different routes, and view formatting, with no luck and usually ending up with just: Routing Error
No route matches [GET] "/demote.3"

I'd like to be able to avoid using the Javascript onClick functionality and do it properly with the controller even if I could remember how to make it work, but I think my route, or view page, or controller is incorrect. Here are the contents of each file:

Controller

def demote
  byebug
  @user = User.find(params[:id])
  @user.mod = false
  redirect_to user_path(@user)
end

View

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>

Routes

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

Up until now, I've been following a course, and I've nailed everything in it and have added some of my own functionality, but I'm still not quite sure how to make sense of routes, or what paths it creates.

I'd like to make other similar custom controller functions beyond show, index, create, delete, update which are all I really understand how to build. I'm not even sure if POST is the correct call in the route.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

献世佛 2025-02-20 10:47:00

我只会设置一个额外的 resource resource restful Action :

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,但是您需要使用正确的方法: :PATCH数据:{Turbo_Method :: Patch}选项,具体取决于您的Rails版本,以使JavaScript驱动程序能够执行欺骗。

I would just setup an additional RESTful action for the resource:

resources :users do
  patch :demote
end
<% if logged_in? && current_user.admin? %>
  <%= button_to "Demote User", demote_user_path(@user), method: :patch %>
<% end %>

You can use link_to instead of button_to but you need to use the correct method: :patch or data: { turbo_method: :patch } option depending on your version of Rails to get the javascript driver to do its trickery.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文