Rails .blank?如果不应该返回true

时间:2011-11-04 04:31:38

标签: ruby-on-rails ruby 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")  %>

控制器

  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  

日志

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", ""]]

3 个答案:

答案 0 :(得分:5)

您的params[:city][:city_id]是一个空字符串,因此@city将为nil(或者您将获得例外,具体取决于您的模型背后的内容):

@city = City.find(params[:city][:city_id])

nil使用非空值(或根据您使用的Ruby版本的异常)响应id方法。您应该查看@city.blank?@city.nil?@city,而不是查看@city.id

if @city
  session[:city_id] = @city.id
  redirect_to show_home_path
else
  ...

答案 1 :(得分:1)

解决方案是使用find_by_id而不是find,因为find在找不到nil的对象时会引发异常。 <{1}}只有在无法找到对象时才会返回find_by_id

答案 2 :(得分:0)

您的代码无效,因为@city为空时 你做了

@ city.id.blank?

nil.id = 4 它实际上在做4.blank? 这是假的