Rails 5:如果params为空,则不允许创建操作

时间:2017-06-06 16:18:38

标签: ruby-on-rails ruby ruby-on-rails-5

我有这个控制器,我可以在其中创建用户组并添加用户,角色:

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_idsrole_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的空参数。

1 个答案:

答案 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