在@ 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", ""]]
答案 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? 这是假的