我有这个控制器,我可以在其中创建用户组并添加用户,角色:
class Strongbolt::UserGroupsController < ApplicationController
# some code...
def create
user_roles #Helper method
respond_to do |format|
if @user_group = Strongbolt::UserGroup.create!(user_group_params)
format.json { head :no_content }
format.js { flash.now[:notice] = "User group #{@user_group.name} created!" }
else
format.json { render json: @user_group.errors.full_messages,
status: :unprocessable_entity }
end
end
end
# some code...
def user_group_params
params.require(:strongbolt_user_group)
.permit(:name, :description, {user_ids: []}, {role_ids: []})
end
如果user_ids
和role_ids
为空,我需要做一些错误或停止创建操作 - 我不需要至少有一个用户和角色的用户组。我该怎么办?
由于这与其中相关模型所在的Strongbolt gem有关,我无法在模型方面进行验证 - 我必须在Controller中进行验证。目前这个功能不存在,所以我必须为我的项目添加它。
到目前为止,我一直在尝试做一些与此有关的事情:
redirect_to 'new' unless params[:user_ids].present?
更新
以下是我的表格的一部分:
<!-- Users tab -->
<div class="tab-pane" id="users">
<div class="i-checks">
<%= f.collection_check_boxes(:user_ids, @users_for_group, :id, :name) do |b| %>
<div class="col-sm-1">
<%= b.check_box %>
</div>
<%= b.label %><br><br>
<% end %>
</div>
</div>
<!-- Roles tab -->
<div class="tab-pane" id="roles">
<div class="i-checks">
<%= f.collection_check_boxes(:role_ids, @roles, :id, :name) do |bb| %>
<div class="col-sm-1">
<%= bb.check_box %>
</div>
<%= bb.label %><br><br>
<% end %>
</div>
</div>
更新2
def create
user_roles #Helper method
respond_to do |format|
unless params[:user_ids].blank? || params[:role_ids].blank?
@user_group = Strongbolt::UserGroup.create!(user_group_params)
format.json { head :no_content }
format.js { flash.now[:notice] = "User group #{@user_group.name} created!" }
else
format.json {
render json: @user_group.errors.full_messages, status: :unprocessable_entity
}
format.js { flash.now[:error] = "User group was not created!" }
end
end
end
在终端我看到了:
Started POST "/en/strongbolt/user_groups" for 10.0.2.2 at 2017-06-06 17:51:59 +0000
Processing by Strongbolt::UserGroupsController#create as JS
Parameters: {"utf8"=>"✓", "strongbolt_user_group"=>{"name"=>"Test @Jun6 v2", "description"=>"test", "user_ids"=>["", "5"], "role_ids"=>["", "2"]}, "commit"=>"Create User Group", "locale"=>"en"}
解决方案
首先,它显示collection_check_boxes
默认包含隐藏值“”,所以我不得不用以下内容删除它:
<%= f.collection_check_boxes(:role_ids, @roles, :id, :name, include_hidden: false) do |bb| %>
如果不删除隐藏字段,Rails将不会检查空参数,因为基本上是params。
然后我能够实现这个:
before_action :validate_presence, only: [:create]
def check_presence
params[:strongbolt_user_group][:user_ids].present? &&
params[:strongbolt_user_group][:role_ids].present?
end
def validate_presence
if !check_presence
render json: { error: {
message: "Bad Request, parameters missing.",
status: 500 }
}
end
end
我必须包含模型名称以检查params存在,否则它不起作用。现在我可以实现JS部分,其中我显示了一些不能为空的内容等消息,但这是不同的故事。现在我的控制器在这个特殊情况下不会接受使用Strongbolt gem的空参数。
答案 0 :(得分:1)
您只需添加验证即可。在这里阅读它们:http://guides.rubyonrails.org/active_record_validations.html
validates :name_of_attribute, presence: true
您还可以阻止通过js提交。如果你使用erb,它看起来像这样:
<%= f.text_field, :name_of_attribute, required: true %>
如果字段为空,这将阻止提交。
如果要在控制器中完全执行此操作,请编写一种方法来检查所需字段的存在,并添加闪存消息,而不是在这些字段为空时保存。
如果未选择其中一个字段,您可以选择使用javascript禁用提交。 (或两者兼有)
更新如何检查空白值。当数组为空,空字符串,空值等时,空白将返回true https://apidock.com/rails/Object/blank%3F
unless params[:user_ids].blank? || params[:role_ids].blank?
# call to your create method
else
# show the user an error message
end