使用html 5“禁用”时返回的参数中的空数组

时间:2018-10-01 21:30:41

标签: html5 ruby-on-rails-5

当我包含“ disabled”属性时,以非管理员身份登录并编辑一次遇见,来自我的Meets控制器的update方法中的以下代码将为catch_params中的services_id数组返回一个空数组。保存相遇时,这会导致问题。保存时会删除以前存在的服务。不好。

 <div class="field">
<%= form.collection_check_boxes :service_ids, Service.all, :id, :name, checked: @encounter.service_ids, disabled: !current_user.admin? %>

有什么想法可以禁止非管理员在复选框中编辑服务,但又避免在保存时删除服务吗?如何将复选框中的服务值重新返回到meet_params?还是以某种方式确保根本不返回任何service_id参数(当非管理员编辑相遇时)?

控制器的更新方法:

def update
respond_to do |format|
  if @encounter.update(encounter_params)
    value_array = []
    @encounter.goal_assessments.each do |a|
      value_array << a.value
    end
    unless value_array.include?(nil)
      @encounter.status = "Assessed"
      @encounter.save
    end
    format.html { redirect_back fallback_location: root_path, notice: 'Encounter was successfully updated.' }
    format.json { render :show, status: :ok, location: @encounter }
  else
    format.html { render :edit }
    format.json { render json: @encounter.errors, status: :unprocessable_entity }
  end
end

这是encounter的参数:

def encounter_params
  params.require(:encounter).permit(:participant_id, :encounter_date, :recurring, :duration_hours, :status, 
    :encounter_type, :note, :staff_note, work_goal_assessment_attributes: [:goal_id, :value, :id], 
    social_goal_assessment_attributes: [:goal_id, :value, :id], 
    community_goal_assessment_attributes: [:goal_id, :value, :id], service_ids: [])
end

API Dock解释了为什么返回空数组的原因(请参阅“陷阱”部分)。显然,HTML规范认为未选中的框不成功,并引导浏览器不发送它们,因此rails的解决方法是插入具有未选中值的隐藏字段。这就是我为非管理员禁用其collection_checkbox时在params中的service_ID数组中的空字符串的来源。

但是不确定如何解决此问题。

1 个答案:

答案 0 :(得分:0)

非管理员用户编辑相遇时,包含service_id的collection_checkboxs不能通过设计进行编辑,但是Rails仍会返回包含service_ids => [“”]的参数(因为API中描述了“陷阱”上面的停靠文章)。

我正在使用以下强大的参数:

def encounter_params
  params.require(:encounter).permit(:participant_id, :encounter_date, :recurring, :duration_hours, :status, 
    :encounter_type, :note, :staff_note, work_goal_assessment_attributes: [:goal_id, :value, :id], 
    social_goal_assessment_attributes: [:goal_id, :value, :id], 
    community_goal_assessment_attributes: [:goal_id, :value, :id], service_ids: [])
end

很显然,permit方法会创建一个新的哈希,因此您不能直接编辑遇到的参数,也不能使用编辑棒。因此,您可以像这样编辑params [:encounter] [:service_ids]:

if encounter_params[:service_ids] == [""]
  params[:encounter][:service_ids] = nil
end

问题解决了。