#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?
хотя и вернул true2. @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