Doorkeeper 中的复选框范围

Checkbox scopes in doorkeeper

我想允许用户 select 复选框列表中的范围。我已经像这样设置了表格:

  <%= f.label :scopes, class: 'col-sm-2 control-label' %>
    <% Doorkeeper.configuration.scopes.each do |scope| %>
      <%= check_box_tag("doorkeeper_application[scopes][#{scope}]", scope, @application.scopes.include?(scope)) %>
      <%= scope %><br>
    <% end %>
  <% end %>

产生

doorkeeper_application[scopes]Oauth::ApplicationsController 接受。虽然用户应该能够 select 多个范围,但不接受 doorkeeper_application[scopes][foo] 等参数。

将这些参数传递给控制器​​的最佳做法是什么?或者是否有更好的做法来实现 Doorkeeper 中的复选框范围?

根据 OAuth2 规范,多个范围应由 space 个字符连接。因此,您应该从 params 中获取已检查范围的名称,将它们与 space " " 连接起来,并将该单个值分配为 doorkeeper_application[scopes] 值。

通常我建议使用表单助手来完成这项任务,因为这样 rails 可以发挥它的魔力,而且您不必处理输入字段的名称。

我不熟悉 Doorkeeper,但我假设范围保存在您数据库的 table 中。在这种情况下,您应该能够在表单所属的模型上定义 has_and_belongs_to_many :scopes 关系。

之后,您可以生成一个 checkbox_collection,如 this question 的答案所示。

从版本 5.1.0rc2 开始,Doorkeeper 通过自动将数组转换为以空格分隔的范围字符串来支持开箱即用。有关详细信息,请参阅 https://github.com/doorkeeper-gem/doorkeeper/pull/1214

对于5.1.0rc2以上的版本,您需要自行修补Scopes关注点或预处理用户输入参数。