当我包含“ 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数组中的空字符串的来源。
但是不确定如何解决此问题。
答案 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
问题解决了。