gpt4 book ai didi

ruby-on-rails - Rails 单表继承。共享 Controller ,如何更新 (CRUD)

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:08 25 4
gpt4 key购买 nike

我有三个类(class) Admin , Client , Agent全部继承自 User < ActiveRecord::Base .该系统是使用 STI 设计的,因此所有类共享相同的 users表。

我有兴趣保持 CRUD 功能几乎相同,因此现在我使用单个 UsersController .

在实现更新功能时,我遇到了一个疑问。这是我的编辑表单:

#Edit Form
<%= form_for(@user,{url:user_path(@user),method: :put}) do |f| %>
<%= render 'edit_fields',f:f %>
<%= f.submit "Save", class: "btn btn-large btn-primary"%>
<% end %>
#UsersController
def edit
@user=User.find(params[:id])
end
def update
binding.pry
#if @user.update_attributes(params[:user]) #<---BEFORE
#WORKAROUND BELOW
if @user.update_attributes(params[@user.type.downcase.to_sym])
flash[:success]="User was updated successfully."
redirect_to user_path(@user)
else
flash[:danger]="User could not be updated."
render 'new'
end
end

我的“问题”是 params依赖于 @user.type@user实例。因此有时会有 params[:client] , 其他时候是 params[:admin]params[:agent] .因此这条线 if @user.update_attributes(params[:user])并不总是有效。

我实现的解决方法很好,但我想知道是否有更干或更优雅的方法来解决这些问题,即在不同的 STI 类之间共享 CRUD。

最佳答案

确实有一个更优雅的解决方案。只需更改您的 form_for 声明并添加 as 选项,如下所示:

<%= form_for(@user, as: :user, url: user_path(@user), method: :put) do |f| %>

这样,在您的 Controller 中,您的参数将在 user 键下而不是在模型的类下。

关于ruby-on-rails - Rails 单表继承。共享 Controller ,如何更新 (CRUD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com