Rails .blank?当它不应该返回true

kat*_*tie 1 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

在@ city.id.blank下面的下一个操作中?不会返回零,当我不选择任何城市.甚至在日志中它显示空白但在控制器中下一步操作 unless @city.id.blank? 仍然返回true.这是怎么回事?提前谢谢你

形成

<%= form_for :city,:size=>"40", :url=>{:action =>"next"} do |f| %>
<%= f.collection_select(:city_id, City.all, :id, :name ,:prompt=>"Select your city")  %>
Run Code Online (Sandbox Code Playgroud)

调节器

  def next
    @city=City.find(params[:city][:city_id]) 
    unless @city.id.blank? 
      session[:city_id] = @city.id
      redirect_to show_home_path
    else
      redirect_to :controller=>"home" ,:action=>"index" 
    end
  end  
Run Code Online (Sandbox Code Playgroud)

日志

Parameters: {"utf8"=>"?",  "authenticity_token"=>"7N5sQqKGKlK5IdXnj81629p1R0p+OpkhhvZDC1PjtHQ=", "city"=> {"city_id"=>""}, "commit"=>"continue"}
City Load (0.1ms)  SELECT "cities".* FROM "cities" WHERE "cities"."id" = ?  LIMIT 1  [["id", ""]]
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

params[:city][:city_id]是一个空字符串,从而@citynil(或取决于什么是你的模型背后,你会得到一个异常):

@city = City.find(params[:city][:city_id])
Run Code Online (Sandbox Code Playgroud)

但是使用非空值(或者取决于您正在使用的Ruby版本的异常)nil来响应该id方法.你应该看@city.blank?,@city.nil?或只是@city不是在看@city.id:

if @city
  session[:city_id] = @city.id
  redirect_to show_home_path
else
  ...
Run Code Online (Sandbox Code Playgroud)