Rails .blank? возвращает true, когда не должно

#ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-3.1

#ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-3.1

Вопрос:

В следующем действии ниже @city.id.blank? не возвращает nil, когда я не выбираю какой-либо город.И даже в журнале он отображается пустым, но в следующем действии контроллера 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", ""]]
  

Комментарии:

1. Для City.find , если объект не найден, будет выдано сообщение об ошибке…

2. @PeterWong: Это зависит от того, что стоит за моделями. Например, find возвращает nil MongoMapper.

3. Какую версию Ruby вы используете и на чем основаны ваши модели (ActiveRecord, MongoMapper, …)?

4. Что произойдет, если вы скажете City.find('') в консоли Rails?

Ответ №1:

Ваша params[:city][:city_id] пустая строка, поэтому @city так и будет nil (или вы получите исключение в зависимости от того, что стоит за вашими моделями):

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

Но nil отвечает на id метод непустым значением (или исключением в зависимости от того, какую версию Ruby вы используете). Вы должны смотреть на @city.blank? , @city.nil? или просто @city вместо того, чтобы смотреть на @city.id :

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

Комментарии:

1. unless @city.blank? хотя и вернул true

2. @mu слишком короткий, я использую ruby 1.9.2

3. @katie: Интересно. Что находится в @city и @city.id ? И откуда взялся ваш find метод?

4. @city and @city.id они оба пустые

5. вы можете посмотреть в журнале просто пустой city_id

Ответ №2:

Это сработало, решение состояло в том, чтобы использовать find_by_id вместо find, потому что find возникает исключение, когда он не может найти объект, которого нет nil . find_by_id возвращает nil только тогда, когда не может найти объект.

Комментарии:

1. Вы можете принять свой собственный ответ, по крайней мере, кажется лучше моего 🙂

2. Итак, вкратце: .blank? никогда не было проблемы вообще.

Ответ №3:

Ваш код не работает, потому что, когда ваш @city пуст, и вы делаете

@city.id.blank?

nil.id = 4 на самом деле это делает 4.пустой? что равно false