2017-02-03 13 views
1

обучения из Rails guide, я не понимаю, как local_assign работы ниже:Rails local_assign против локальных переменных

Чтобы передать локальную переменную к частичному только в конкретных случаях использовать local_assigns.

  • index.html.erb

    <%= render user.articles %> 
    
  • show.html.erb

    <%= render article, full: true %> 
    
  • _articles.html.erb

    <h2><%= article.title %></h2> 
    
    <% if local_assigns[:full] %> 
        <%= simple_format article.body %> 
    <% else %> 
        <%= truncate article.body %> 
    <% end %> 
    

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

Как частичное даже отображение визуального действия, когда оно имеет имя _articles, которое будет отображаться только для действия индекса? Я также не понимаю, почему вы используете, добавьте опцию full: true, когда вы могли бы использовать только locals: {full:true}. Какая разница?

+0

Нет никакой практической разницы между 'render: locals: {full: true}' и 'render full: true', они оба назначают локальную переменную с именем' full', последняя - только более новая стенография. – max

+0

Что касается вашего первого вопроса, то имя '_articles' является опечаткой. Частичное имя должно быть '_article'. Я открыл [тянуть запрос, чтобы исправить руководство] (https://github.com/rails/rails/pull/27896) – meagar

ответ

4

Что касается использования local_assigns:

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

У вас есть два варианта с дополнительных местных жителей:

Во-первых, с помощью local_assigns[:variable_name], которые будут nil, когда названный местный не был предоставлен, или значение переменной.

Во-вторых, вы можете использовать defined?(variable_name), который будет nil, когда переменная не определена, или truthy (Строка "local_variable"), когда локальная является определена.

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

  • if local_assigns[:full]
  • if defined?(full) && full

As по вашим конкретным вопросам:

Как частичное, даже отображаемое действием show, когда оно имеет имя _articles, которое будет отображаться только для действия индекса?

This is a typo. Правильное частичное имя - _article.html.erb. Независимо от действия, index или show, правильное частичное имя является уникальным модели. В случае рендеринга коллекции моделей (как в index.html.erb) частичное все равно должно быть однозначно названо.

Я тоже не понимаю, почему вы используете добавить опцию full: true, когда вы могли бы просто использовать locals: {full:true}. Какая разница?

Дело в том, что синтаксис full: true короче. У вас есть два одинаковых варианта:

  • render partial: @article, locals: { full: true } или
  • render @article, full: true.

Вторая значительно короче и менее избыточна.