2012-02-17 2 views
0

У меня есть приложение, которое использует рельсы партиалов и в развитии все прекрасно работает, но в производстве я получаю ошибкуRails 3 делает частичную ошибку

Мы сожалеем, но что-то пошло не так.

Мы получили уведомление об этой проблеме, и мы рассмотрим ее в ближайшее время.

Я проверил файл production.log и это ошибка я получаю

ActionView :: Template :: Ошибка (не определен метод `MODEL_NAME» для NilClass: Class):

Вот строки, которые вызывают проблемы

<%= div_for blog do %> 

и вот причиняет этот файл

<%= render :partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last}%> 

вот вся ошибка

ActionView::Template::Error (undefined method `model_name' for NilClass:Class): 
1: <%= div_for blog do %> 
2: <p> 
3: <b>Title:</b> 
4: <%= blog.title %> 
app/views/blogs/_blog.html.erb:1:in 
app/views/profiles/show.html.erb:22:in 

любые идеи о том, как я могу разрешить эту ошибку?

+0

Вы 100% уверены в производственной среде, что '@ profile' на самом деле имеет никакого' blogs'? Если это не так, вы можете настроить '' blog' на 'nil' при вызове вашего частичного. –

+0

Да Я нахожусь в рабочей среде, и у профиля нет ничего, если пользователь не создаст его, но вы должны увидеть страницу профиля, если ничего не указано. Я что-то делаю неправильно? – coletrain

ответ

2

Вы эффективно вызываете nil.last, который выдает такую ​​ошибку.

Используйте условный, чтобы сделать частичный только если@profile содержит блог:

<%= render(:partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last}) if @profile.blogs.present? %> 

Или, что я буду делать, используйте частичный. По вашему мнению:

<%= blogs_or_message %> 

В частично:

def blogs_or_message 
    if @profile.blogs.present? 
    render(:partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last}) 
    else 
    "No blogs found" # <= simple error message instead of nothing 
    end 
end 
+0

Могу ли я также сделать что-то вроде '<% if # {model} nil? %> создать что-то <% else %> частично здесь <% end %> 'или это плохая идея? – coletrain

+0

Пара с этим ответом: 1) Это не вызов 'last', который терпит крах, а вызов' model_name' (Rails пытается дать эти идентификаторы DIVs, например «blog_42»), и 2) Добавление условного к рендерингу вызов означает, что вы должны добавить его к каждому вызову рендеринга к частичному - лучше поместить его в частичное. Однако настройка 'blogs_or_message' - приятный штрих - хороший звонок на этот. –

1

Я предполагаю, что Rails не является умным и пропускает этот DIV, если blog - nil. Вот несколько возможных путей их устранения:

Если вы действительно только хотите сделать один блог:

<% div_for(@profile.blogs.last) do %> 
    ...whatever... 
<% end if @profile.blogs.last %> 

Или, если вы хотите DIV для каждого блога, вам не нужно условное, так как @profile.blogs будет дайте вам пустой массив, и Rails знает, что делать с этим:

Надеюсь, что это поможет!

+0

это не пропуск div_for, он не работает, потому что я еще ничего не создал, но если я создам условный оператор, описанный выше, безопасный ли он способ? – coletrain

+0

@coletrain - Да. 'If' применяется ко всему вызову функции, включая блок (например:' (div_for (x) do ... end), если y'), поэтому функция (и, следовательно, блок) будет вызвана только, если есть блог для рендеринга. –

+1

Также проверьте функцию 'blogs_or_message' в ответе gg_s. Это может быть вспомогательной функцией или условным в частичном - в зависимости от того, что угодно - но хорошо иметь какой-то «Нет блогов? Давайте сделаем одно!» а не просто пустоты. –

Смежные вопросы