2

Я примерно на полпути через главу 11 учебного пособия Хартл, где он показывает, как добавить фид микросоты на домашнюю страницу. Он делает это через код:Почему подача недействительного сообщения прерывает фид микросообщения (глава 11)?

@feed_items = current_user.feed.paginate(page: params[:page]) 

где корм метод

def feed 
    Micropost.where("user_id = ?", id) 
    end 

Теперь в домашней странице, где предполагают подачу micropost, чтобы быть у вас есть частичный, содержащий:

<% if @feed_items.any? %> 
    <ol class="microposts"> 
    <%= render @feed_items %> 
    </ol> 
    <%= will_paginate @feed_items %> 
<% end %> 

Теперь в учебнике упоминается, что на домашней странице, если вы отправите недопустимую микросоту, она сломается:

"при неудачной подаче микропотоков на главной странице ожидается переменная экземпляра @feed_items , поэтому в настоящее время не удалось выполнить пропущенные представления."

Я не понимаю объяснения, почему это происходит. Должно ли @feed_items состоять из всех других допустимых микросообщений из базы данных? Так что, даже если вы отправляете недопустимый пост, @feed_items заполняется предыдущими действительными микропостями? Я не понимаю, как недействительная микропость способна повлиять на @feed_items, тем более что @feed_items извлекает микросоты из базы данных, которая содержит только действительные микропосты из-за валидаций, присутствующих на представленных микросостах.

ответ

1

Потому что тогда @feed_items будет nil и когда вы звоните: @feed_items.any? на ваш взгляд, что будет nil.any? и что будет безуспешной с сообщением об ошибке:

NoMethodError: undefined method `any?' for nil:NilClass 
+1

Я не совсем уверен, как @feed_items становится нулевым, так как он рисует микросоты из базы данных, которая имеет действительные микропосты. Могу ли я что-то здесь что-то здесь? – user2889046

+0

Потому что, если подача заявки на микросопротивление терпит неудачу, тогда у вас не будет действительного 'id' в ваших' params', поэтому ваш метод 'feed' не будет работать, поэтому ваши' @ feed_items' не будут заполнены. Теперь ясно? –

+0

Да, спасибо за помощь – user2889046

0

При отправке micropost, вы называете create действие MicropostsController:

def create 
@micropost = current_user.microposts.build(micropost_params) 
if @micropost.save 
    flash[:success] = "Micropst created" 
    redirect_to root_url 
    else 
    render 'static_pages/home' 
end 
end 

Если micropost сохраняет успешно, вы будете перенаправлены. Вызывается действие home действия StaticPagesController. @micropost и @feed_items создаются тогда. Все работает нормально.

Если micropost делает не сохранить успешно, то вы остаетесь в StaticPagesController, и попытаться оказать static_pages/home шаблон. Для этого вам нужны переменные экземпляра @micropost и @feed_items, но на данный момент вы определили только @micropost.

Именно поэтому предлагаемое обходное решение состоит в том, чтобы определить переменную экземпляра @feed_items как пустой массив, прежде чем пытаться отобразить шаблон.