Rails: Как сделать личные сообщения общедоступными после понижения уровня пользователя?

Я новичок в RoR, и в этом приложении я хочу сделать личные сообщения общедоступными, как только пользователи отменят свои платные услуги. Другими словами, личные сообщения пользователя станут общедоступными после того, как пользователь понизит уровень учетной записи до стандартного.

Ниже показано, как я подхожу к этому сценарию:

ПодпискиКонтроллер:

def downgrade
    subscription = current_user.subscription

    if subscription.delete
      downgrade_user_to_standard
      current_user_downgrade_posts
      flash[:success] = "Sorry to see you go."
      redirect_to user_path(current_user)
    else
      flash[:error] = "Can't downgrade at this moment."
      redirect_to root_path
    end
  end

Контроллер приложений:

protected

def downgrade_user_to_standard
     current_user.update_attributes(role: "standard")
   end

   def current_user_downgrade_posts
    privateposts = current_user.posts.where(private: true)
    privateposts.each do |privatepost|
      privatepost.posts_update_attributes(private: false)
    end
   end 

Когда я протестировал его на сервере и консоли, я обнаружил, что созданный ранее личный пост не стал общедоступным, как ожидалось, после понижения уровня премиум-пользователя до стандартного уровня. Поскольку при запуске сервера rails не было сообщения об ошибке, может ли кто-нибудь указать мне, какие шаги я пропустил и как я могу заставить его работать?

Заранее спасибо!


person Florence Liang    schedule 28.04.2015    source источник


Ответы (1)


Я не думаю, что код должен быть в контроллере, но хорошо...

вы должны изменить:

privatepost.posts_update_attributes(private: false)

с:

privatepost.update_attribute(:private, false)

если вам не нужны проверки, обратные вызовы и временные метки касания, вы можете удалить цикл и использовать:

current_user.posts.where(private: true).update_all(private: false)
person Aguardientico    schedule 28.04.2015
comment
Спасибо большое! Я думал о том, чтобы поместить код в модель, но это вызвало ошибки, когда я понизил уровень пользователя, поэтому я поместил его в контроллер. - person Florence Liang; 28.04.2015