RubyonRails试图在作为另一个实体登录时更新用户表中的布尔值



我是Ruby和RubyonRails的新手。我正在尝试更新一个网络应用程序,该应用程序已注册志愿者,需要获得批准才能访问完整的网站功能。我在志愿者数据库模型中添加了一个名为:approved的布尔字段,当志愿者注册时,该字段默认为false,并要求登录的管理员将其更新为true。我在我的项目中创建了一个管理员类,可以从控制器中查看待定志愿者的列表:

def view_pending_volunteers
@navbar = true
@volunteers = Volunteer.where(approved: false)
end

在管理员视图中,我希望使用与志愿者相关联的复选框,提交后,管理员可以更新志愿者表中的:approved字段。

我有几个问题不清楚,无法完成这项任务:

  1. 在我的管理员模型中,我使用has_many:volunteers进行迁移,将volunteer_id作为外键放入管理员数据库表中。这是否足以完成手头的任务,或者我是否需要为:approved创建一个联接表?我不能让志愿者加入:管理员,因为他们不能自己注册,他们需要由管理员创建
  2. 我不确定如何在管理员视图中为复选框帮助程序配置代码。我正在使用form_with,但我确信我的代码不正确。我想将与待定志愿者列表的:approved字段相关联的每个check_box的一组参数传递回控制器
<p><b style="color:blue;font-size:24px;">
<%= form_with(model: @volunteer, local: true) do |f| %>
<% @volunteers.each do |v| %>
<li>
Volunteer: <%= x.first_name%> <%= x.last_name%> &emsp;Age: <%= x.age%> &emsp;Description: <%= x.description%>&emsp;
<%= f.check_box (@volunteers, v.approved, options = {}, checked_value = "1", unchecked_value = "0")%>

</li>
<% end %>
<%= f.submit "Approve" %>
<% end %>
</b></p>
  1. 我不知道如何处理返回给管理员控制器的复选框值数组,以便更新志愿者数据库表。我是否需要在视图中创建一个散列(如何做到这一点?(,然后通过散列循环到每个被选中的志愿者的update_attribute(:approved,true(?我已经在管理员控制器中为POST操作创建了一个update_pending_volunteers方法,但不清楚应该存在的代码,因为我不确定复选框方法

提前感谢您对新手的耐心。这似乎是一件简单的事情,但我不确定正确的方法。我花了相当多的时间审查API和视频以及堆栈溢出的文章,但似乎无法拼凑出能让我对正确完成这项工作的特定方法充满信心的信息。同样,这似乎是一件很简单的事情,但却成为了挫折的根源。

  1. 请参阅Rockwell Rice的评论。不要为此功能创建任何类型的关系。

  2. 使用form_with的URL功能,而不是模型。你不是在为一个志愿者行动,而是在为许多人行动。创建一个后路由(即approve_volunteers(。在视图中,您将创建如下复选框:

<%= form_with(url: approve_volunteers_path, local: true) do |f| %>
<% @volunteers.each do |v| %>
<div class="field">
<label class="checkbox">
Volunteer: <%= x.first_name%> <%= x.last_name%> &emsp;Age: <%= x.age%> &emsp;Description: <%= x.description%>&emsp;
<input type="checkbox" name="volunteers[]" value="<%= v.id %>"> 
</label>
</div>
<% end %>
<%= f.submit "Approve" %>
<% end %>

这应该像{"volunteers" => ["1", "3"]}一样通过表单发送params,并将其余部分留空。你可能得玩一玩这些。请检查控制台中的参数。

然后在你的控制器中,类似于:

def approve_volunteers
volunteer_ids = []
volunteers = Volunteer.where(approved: false)
volunteers.each do |v|
if v.id.in?(params[:volunteers])
volunteer_ids << v.id
end
end
Volunteer.where('id IN (?)', volunteer_ids).update(approved: true)
end
  1. 见上文

Sam提供的复选框代码运行良好。我的视图url是";update_pending_volunteers_path"我需要稍微改进一下格式。

控制器中的代码通过志愿者id数组循环,这些id被传递回控制器,如下所示:

def view_pending_volunteers
@navbar = true
@volunteers = Volunteer.where(approved: false)
end
def update_pending_volunteers
@navbar = true
params[:volunteers].each do |value|
Volunteer.find(Integer(value)).update(approved: true)
end
redirect_to (administrator_dashboard_path)
end

传递到视图中的志愿者已经被解析为未经批准的志愿者,因此检查后返回的volunteer_ids仅来自该列表。

最新更新