ruby-on-rails - 使用复选框确认 Rails 设计用户
问题描述
在管理用户时,我希望管理员能够使用复选框来确认用户的帐户,以触发用户的设计 user.confirm 方法。
我最初认为我可以使用 attr_accessor 设置一个名为confirm_now的变量,用作用户表单上的布尔值,然后在控制器更新操作(或通过之前/之后的操作回调)评估布尔值并确认用户因此。
我仍然不太确定我是否需要模型中的方法来设置和读取 attr_accessor 变量,我仍然对此有所了解......或者我可能过于复杂了,应该调用 user.confirm单击保存时的方法(这是不好的做法吗?-我很犹豫将此字段添加到 user_params 中)。
模型:
class User < ApplicationRecord
attr_accessor :confirm_now
...
控制器:
class UsersController < ApplicationController
...
def update
if params[:user][:password].blank?
params[:user].delete(:password)
params[:user].delete(:password_confirmation)
end
if !@user.confirmed? && @user.confirm_now
@user.confirm
end
...
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :account_active, :confirm_now)
end
表单片段(这会按预期进行评估和工作):
<% if !@user.confirmed? %>
<%= f.input :confirm_now, label: 'Confirm User', as: :boolean, checked_value: true, unchecked_value: false %>
<% end %>
Rails 日志(在表单上检查时设置了 attr_accessor):
Processing by UsersController#update as HTML
Parameters: {"authenticity_token"=>"...", "user"=>{"first_name"=>"gg", "last_name"=>"gg", "email"=>"gg@gg.com", "account_active"=>"1", "confirm_now"=>"true", "password"=>"[FILTERED]"}, "commit"=>"Save", "id"=>"45"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."first_name" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."first_name" ASC LIMIT $2 [["id", 45], ["LIMIT", 1]]
CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."first_name" ASC LIMIT $2 [["id", 45], ["LIMIT", 1]]
Redirected to http://localhost:3000/users
Completed 302 Found in 6ms (ActiveRecord: 0.6ms | Allocations: 2665)
提前致谢!
解决方案
为简化起见,我将其设为按钮,并confirmed_at
直接传递该字段。
参数白名单:
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :account_active, :confirmed_at)
end
形式:
<%=
if @user.confirmed?
link_to 'Unconfirm user',
user_path(@user, { user: { confirmed_at: nil } }),
method: :patch
else
link_to 'Confirm user',
user_path(@user, { user: { confirmed_at: Time.current } }),
method: :patch
end
%>
请根据您的路线调整路径/方法类型。
推荐阅读
- python - 在函数中生成坐标的二元素元组
- c++ - 从模板类版本控制派生类的序列化
- css - 有没有办法将内容对齐以恰好出现在另一个下方?
- html - 当我将角色向右移动时,如何逐帧迭代多个精灵?
- c++ - QT、GDCM 库问题。“未定义对 '_imp_ZNgdcmr11ImageReader...' 的引用
- r - 作者列表中的R森林图上标
- laravel - Laravel 6.0 如何使用 Route:resource 获取路由相同的文件夹控制器
- asp.net-web-api - 来自 Postman 的 OData $batch
- android - 显式深度链接导航回栈问题
- android - Android 下载管理器:在 HTTP_DATA_ERROR 失败后下载不会恢复