Понимание «магии» Rails в отношении рендеринга частичных файлов (и передачи им локальных переменных).
Почему это работает:
<%= render "rabbits/form" %>
И эта работа:
<%= render "rabbits/form", :parent => @warren, :flash => flash %>
но это не работает:
<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
Но это действительно так:
<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
Кроме того, как я могу найти эти нюансы, чтобы не беспокоить людей на SO?
ruby-on-rails
partial-views
Мельтеми
источник
источник
Ответы:
Короткий ответ: метод рендеринга смотрит на первый аргумент, который вы передаете. Если вы передадите хэш (который включает
:partial => 'foo', :locals => {blah blah blah}
), то он передаст все ваши аргументы в виде хеша и соответствующим образом проанализирует их.Если вы передадите строку в качестве первого аргумента, предполагается, что первый аргумент - это ваше частичное имя, а остальная часть будет передана как ваши местные. Однако в этом последующем вызове он фактически назначает
:locals => your_locals_argument
, которое в данном случае является целым:locals => {locals hash}
, а не только{locals hash}
; то есть вы получите:locals => {:locals => {locals hash}}
, а не:locals => {locals hash}
.Так что мой совет - просто всегда явно передавать значения одним и тем же способом, и у вас не будет проблем. Чтобы узнать об этом, я перешел непосредственно к самому коду ( actionpack / lib / base.rb ,
render()
метод в Rails 2; Rails 3 отличается). Это хорошее упражнение.Более того, не беспокойтесь о том, чтобы "беспокоить" людей на SO. Вот почему этот сайт существует. Я даже кое-чему научился.
источник
если вам нужно указать: locals, вам нужно указать: partial или: template
должно сработать
источник
clone https://github.com/rails/rails.git
? или есть способ лучше? Извините , но я относительно новый для RoR и до сих пор не нашел хороший / легкий / последовательный способ посмотреть на Rails документации ... такие , что IS - либо.http://api.rubyonrails.org/
не легко для поиска. и источник из git тоже не ... вздохЧестно говоря, я знаю только об этих вариантах использования, потому что я следил за Rails последние пару лет и читал объявления о добавлении нового способа сделать это. Я сам часто ошибаюсь, но обычно это легко исправить.
Если вы спросите меня, это одна из тех частей Rails API, которая не была досконально продумана. С годами он просто накапливал все больше и больше синтаксического сахара, не отказываясь от старого поведения. Способ рендеринга - диабет.
Что еще хуже, рендер ведет себя по-разному в контроллере и в представлении. Я также просматриваю содержимое первого аргумента, чтобы узнать, является ли он файлом, шаблоном, действием или частичным. Если он начинается с косой черты, значит, это файл или что-то в этом роде.
Я предпочитаю по возможности использовать более короткие обозначения. Потому что короткие обозначения хорошо передают намерение. Читая его, он обычно делает то, что вы думаете. Написание частичных выражений непросто.
источник
Вот источник метода рендеринга из http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :
Надеюсь на эту помощь!
источник