hidden_​​field_tag不允许我传递空数组 - Ruby on Rails

时间:2015-06-25 11:05:25

标签: ruby-on-rails

Rails 4.2.1。

我的用户模型(使用mongoid):

class User

    field :first_name,           :type => String
    field :last_name,            :type => String
    field :email,                :type => String
    field :roles,                :type => Array,     :default => []

end

然后,我的edit.html.erb(相关部分):

<%= f.label :roles %>
<%= hidden_field_tag 'user[roles][]', [] %>
    <% roles = Tools::Utils.load_roles %>
    <% @roles.each do |role| %>
        <li>
            <%= check_box_tag('user[roles][]', role, @user.roles.include?(role.downcase))%>
            <%= h role %>
        </li>
    <% end %>

当我进入编辑视图时:

enter image description here

然后我取消选中:

enter image description here

并提交。这是我在UsersController中获得的params

{"user"=>
  {
   "first_name"=>"test",
   "last_name"=>"test",
   "email"=>"test@test.com",
   "roles"=>[""]
   }
}

注意"roles"=>[""]。我得到一个带有空字符串的数组,而不只是一个空数组(所需)。

我怎样才能做到这一点?我尝试了多种方法,但似乎都没有。

2 个答案:

答案 0 :(得分:0)

添加before_save回调从数组中删除空白字符串。

user.rb

before_save :remove_empty_strings_from_roles

def remove_empty_strings_from_roles
  self.roles.reject!( &:blank? )
end

请注意,在Rails 6+中,可以使用self.roles.compact_blank代替self.roles.reject!( &:blank? )

答案 1 :(得分:-1)

哪个value拥有您的checkbox? 所以它的值等于an empty string

当您渲染表单时,不会检查此值,因为default: [], 但浏览器发送值as it look for ...

你应该写:

  

字段:roles,:type =&gt;数组,:默认=&gt; [ '无']

我希望它可以帮到你!