从数组中删除空白元素

10

在 Ruby on Rails 表单中保存多选时,似乎会在前面添加一个空元素。如何删除它?该字段名为 selected_player。

当我从Ruby on Rails表单中保存多个选择时,它似乎会在前面添加一个空白元素。如何移除它?该字段名为selected_player。

{"utf8"=>"✓",
 "authenticity_token"=>"H8W7qPBezubyeU0adnTGZ4oJqYErin1QNz5oK0QV6WY=",
 "schedule"=>{"event"=>"1",
 "result_id"=>"",
 "time"=>"26/10/2012",
 "duration"=>"15",
 "arrival_time"=>"14",
 "location_id"=>"25",
 "selected_players"=>["", "38", "41"],
 "team_id"=>"1",
 "opponent_id"=>"7",
 "home_or_away"=>"Home"},
 "commit"=>"Save Event"}

控制器

def update
  @schedule = Schedule.find(params[:id])
  @user = User.find(current_user)
  @players = User.where(:team_id => current_user[:team_id]).all

  respond_to do |format|
    if @schedule.update_attributes(params[:schedule])
      Notifier.event_added(@user,@schedule).deliver
      format.html { redirect_to(@schedule,
                                :notice => "#{event_display_c(@schedule.event)} vs #{@schedule.opponent.name} was successfully updated.") }
      format.json { head :no_content }
    else
      format.html { render :action => "edit" }
      format.json { render :json => @schedule.errors, :status => :unprocessable_entity }
    end
  end
end
7个回答

20

这对空字符串也适用:

array.delete_if(&:empty?)

要过滤空字符串和nil值,请使用:

array.delete_if(&:blank?)

例子:

>> a = ["A", "B", "", nil]
=> ["A", "B", "", nil]
>> a.delete_if(&:blank?)
=> ["A", "B"]

这个功能完美运作,可以轻松地添加到模型逻辑中的“保存前”函数中。 - Michael Taylor

7

Ref reject! of Array class

params["schedule"]["selected_players"] = ["", "38", "41"]
params["schedule"]["selected_players"].reject!{|a| a==""} #gives params["selected_players"] = ["38", "41"]

这个错误提示是 undefined method 'reject!' for nil:NilClass - Boss Nass
请检查我的编辑答案,将 params["selected_players"] 更改为 params["schedule"]["selected_players"] - Salil
为了避免参数不完整的问题,您可以添加 try: params["schedule"]["selected_players"].try(:delete_if, &:blank?) - aqwan

2
这也应该可以正常工作。
params["schedule"]["selected_players"].reject!(&:blank?)

0

类似于:

params["selected_players"].select!{|val| !val.empty?}

应该可以工作


0

"selected_players"是什么?它类似于集合关联的“collection_singular_ids”吗?如果是这样的话,可以保留它,因为ActiveRecord将使用以下代码从数组中删除空元素:

ids = Array.wrap(ids).reject { |id| id.blank? }

0

如果你想在模型中处理而不是在控制器中处理,你可以添加一个像这样的setter方法

def selected_players=(param_array)
  write_attribute(:selected_players, param_array.reject(&:blank?))
end

-3

2
这对于像 OP 想要的空字符串不起作用。 - Wizard of Ogz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接