Я пытаюсь проверить, возвращает ли метод находки результат. Мой метод находки следующий:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
Каков был бы хороший способ проверить это post
содержит результат?
find: all
возвращает пустой массив ([]
), если строки не возвращены, поэтому вы можете просто использовать его следующим образом:
post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1)
unless post.empty?
# do something...
end
Кстати, если вы это сделаете find: all
вы собираетесь получить массив, а не одну строку. Если вы пытаетесь получить только одно сообщение, было бы проще использовать помощник find_by
или find: first
или просто first
вместо:
post = Post.find_by_url params['url']
# or
post = Post.first :conditions => { :url => params['url'] }
# then...
if post
# do something...
end
Используйте BANG! версия метода find_by_url
, чтобы заставить его вызвать исключение, не удалось найти и затем восстановить его позже в том же методе / действии.
def show
Post.find_by_url!(params[:url])
rescue ActiveRecord::RecordNotFound
flash[:notice] = "The URL you were looking for could not be found."
redirect_to root_path
end
end
Если бы вы не вызывали здесь исключение, я считаю, что Rails покажет страницу public / 404.html .
если сообщение не содержит результатов, это будет пустой список, а затем:
post.empty?
вернет истину.
Вы можете попробовать ActiveRecord :: Base.exists? перед
Post.exists?(:conditions => { :url => params['url'] })
это может быть так же просто, как изменить ваш искатель на:
post = Post.find(:first, :conditions => { :url => params['url'] })
С этим искателем сообщение будет либо возвращать одиночное значение, либо ноль. Поскольку nil ведет себя как false в операторе условия, вы можете сказать что-то вроде следующего:
if post
# do something
else
# do something else
end