2013-10-14 4 views
1

Я только что закончил добавлять вложенный ресурс в приложение Ruby on Rails.Переменный вызов в виде рельсов

Это было главным образом угадать, копировать и вставлять.

Все работает сейчас.

Но я обеспокоен тем, что при использовании помощников URL я должен был использовать две различные формы переменных: одну с @ в начале и одну без @.

В моей частичной, я использовал:

=> link_to t('ui.edit'), edit_course_lesson_path(@course, lesson) 

В случае, если я добавить '@' перед урока, я получил следующее сообщение об ошибке:

Routing Error 

No route matches {:action=>"edit", :controller=>"lessons", :course_id=>#<Course id: 2, 
title: "title x", user_id: 1, subject_id: 1, student_level_id: 1, objectives: "obj xx", 
created_at: "2013-08-09 15:51:38", updated_at: "2013-08-09 15:51:38">, :id=>nil} 

Try running rake routes for more information on available routes. 

И в моих регулярных просмотров:

=> link_to t('ui.edit'), edit_course_lesson_path(@course, @lesson) 

Последний пример, если я пишу курс без «@», то я получаю:

undefined local variable or method `course' for #<#<Class:0x007f5e10082800>:0x007f5e10a64760> 

Просто хотел бы знать разницу, добавляя или опуская «@» в представлениях. Вероятно, ключевым фактором здесь является частично vs стандартный вид.

спасибо!

PS: Кроме того, я нашел этот пост полезным на вложенной теме ресурсы:

http://blog.8thcolor.com/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/

ответ

1

@ обозначает переменную экземпляра, установленный в контроллере для экземпляра модели. Некоторые виды будут называть частичным, например:

= render @courses 

будет вызывать частичную называемую _course.html.haml (или ERB или тонкий) и автоматически передать его локальную переменную для каждого рендеринга.

Внутри этого частичного использования используется локальная переменная course, например.

= course.subject.title 
= course.title 

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

1

Вы очень недавно в разработке RoR, не так ли? Я призываю полностью пройти через некоторые новички Rails и Ruby, потому что кажется, что вы не понимаете нескольких базовых концепций Ruby.

Короткий и очень приблизительный ответ на ваш вопрос.

переменные без знака @ являются локальными переменными, которые существуют в локальной области видимости - сферу метода, частичного охвата, вид сферы, блок сферы и т.д.

Переменные с @ признаками являются переменными экземпляра - они существуют в рамках экземпляра.В случае, когда объекты контроллеров и представлений одинаковы, поэтому переменная экземпляра, определенная в действии контроллера, доступна в ваших частях, представлениях, макетах.

Отвратительная вещь о том, что они не бросают никаких ошибок, если не определено - вы просто возвращаете нулевой объект. И это то, что на самом деле происходит в вашей ошибке маршрутизации - @lesson - это nil, а Rails не может создать правильный URL.

В вашем втором случае вы пытаетесь вызвать локальную переменную, которая не существует, поэтому она выдает NoMethodError, потому что, не найдя переменную, она пытается вызвать метод с тем же именем.

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