метод ruby ​​вернуть true или false - PullRequest
1 голос
/ 29 января 2012

Я хочу получить от метода ruby ​​ true , если за всеми сообщениями следят за людьми, и false, если not .

У меня есть этот метод:

def number_of_posts_that_are_followed
  user_to_be_followed = User.find(params[:id]) #users whose posts, will be followed by another user
  user_to_be_followed.posts.each do |this_post| 
    if current_user.follows?(this_board) == true #method that returns true if the current_user is following this post of the user whose posts will be followed
     return true
    else
     return false
    end 
   end
  end

Проблема в том, что этот метод возвращает значение true, если за первым сообщением (в первой итерации) следует current_user. Я хочу вернуть значение true, если за всеми сообщениями следят, или false, если за ними не следят.

Я попытался поставить счет, как это:

count = user_to_be_followed.posts.count

Ответы [ 4 ]

8 голосов
/ 29 января 2012

Вы должны использовать метод Enumerable # all? , чтобы проверить, что все элементы списка соответствуют условию, определенному в предикате (блок, который возвращает логическое значение).

все?[{| OBJ |block}] → true или false

Передает каждый элемент коллекции в указанный блок.Метод возвращает true, если блок никогда не возвращает false или nil.Если блок не указан, Ruby добавляет неявный блок {| obj |obj} (это все? вернет true, только если ни один из членов коллекции не равен false или nil.)

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.all? {|post| current_user.follows? post }
end
2 голосов
/ 29 января 2012
def number_of_posts_that_are_followed
  user_to_be_followed = User.find(params[:id]) #users whose posts, will be followed by another user
  value = true #will stay true unless changed
  user_to_be_followed.posts.each do |this_post| 
    if current_user.follows?(this_board) != true
      value = false
    end 
  end
  value #returned
end
0 голосов
/ 29 января 2012
def number_of_posts_that_are_followed
  user_to_be_followed = User.find(params[:id]) #users whose posts, will be followed by another user
  user_to_be_followed.posts.each do |this_post| 
    if current_user.follows?(this_board) != true
      return false
    end 
  end
  return true
end
0 голосов
/ 29 января 2012

Небольшой рефакторинг SimonMayer's:

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.each do |this_post| 
    return false unless current_user.follows?(this_post)
  end
  true
end

РЕДАКТИРОВАТЬ: Еще короче, в стиле рубина:

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.map do |this_post| 
    not current_user.follows?(this_post)
  end.any?
end
...