Статьи

Ruby on Rails с 3-й недели с нуля

Добро пожаловать в Ruby on Rails From Scratch Week 3! На этой неделе мы сосредоточимся на конкретных вещах, которые вам нужно знать о фреймворке. Например, мы поговорим о манипулировании структурой проекта двумя способами (рендеринг и перенаправление). Мы также поговорим о том, как добавлять ссылки в рельсы и как комментировать код. Давайте начнем уже!

Если вы не читали Части 1 и 2, настоятельно рекомендуем ознакомиться с ними перед тем, как продолжить изучение этого учебника.

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

В этом примере заголовок является более сложным, чем фактический урок. Мы собираемся просто использовать то, что в одном действии, и делать то же самое в другом. Давайте использовать знания, которые мы получили на прошлой неделе о переменных экземпляра, и применим их сейчас. Во-первых, давайте создадим новое действие под названием «another_action»; затем другое действие, называемое «текст». Затем мы собираемся получить действие из текста и поместить его в «another_action». Мы собираемся доказать это, ссылаясь на переменную экземпляра в представлении «another_action», которое было назначено в «текстовом» контроллере. Извините, если это не имеет смысла. Если вы не поняли, что я только что сказал, посмотрите на следующий код, который, надеюсь, поможет вам:

01
02
03
04
05
06
07
08
09
10
class LearnController < ApplicationController
     
  def another_action
    text
  end
 
  def text
    @text = ‘This text came from another action’
  end
  end

Затем мы собираемся создать представление с именем «another_action.html.erb», где мы ссылаемся на переменный текст.

1
2
3
4
5
6
7
8
9
<html>
  <head>
  <title>Action Demo</title>
  </head>
<body>
     
  <%= @text %>
  </body>
  </html>

объяснение

Как вы можете видеть, мы ссылались на действие «текст», просто поместив его внутри «another_action». Делая это, мы также передали определение «текст», который был переменной экземпляра. Для дальнейшей демонстрации этого принципа давайте рассмотрим это в нескольких различных ситуациях, и все они работают.

01
02
03
04
05
06
07
08
09
10
class LearnController < ApplicationController
     
    def another_action
        @text = text
    end
     
    def text
        misc_text = ‘This text really traveled!’
    end
end
Текст путешествовал

Теперь мы собираемся сделать еще более сложным:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<html>
class LearnController < ApplicationController
     
    def another_action
        @text = «text you’ll never see»
        @text = text
    end
     
    def text
        wanted_text = overwrite_view
    end
     
    def overwrite_view
        overwrite_text = ‘This text overwrote the original text’
    end
end

Это порядок событий, который сделал следующий код:

  • Дали переменной экземпляра «text» значение «text, который вы никогда не увидите»
  • Затем он переназначил его на действие «текст»
  • Переменная «текст», теперь имеет значение локальной переменной, требуемый текст.
  • Переменная wanted_text имеет значение действия «overwrite_view»
  • Overwrite_view имеет локальную переменную со значением «Этот текст перезаписал оригинальный текст»
  • Это возвращает к переменной экземпляра @text.

Мы сделаем это проще:

01
02
03
04
05
06
07
08
09
10
11
class LearnController < ApplicationController
     
    def another_action
        @text = «text you’ll never see»
        text
    end
     
    def text
        @text = ‘This text overwrote the original text’
    end
end
передать переменную
1
class LearnController < ApplicationController def another_action @text = text end def text first = ‘This text should not be passed to @text’ second = ‘This text would be put into the variable on default’ return first end end

Этот пример особенно важен, так как вы сейчас изучаете немного больше синтаксиса; команда возврата . Это скажет действию, что возвращать в конце.

возвращение

Каждый должен знать, как создать нормальную HTML-ссылку. (Используя <a href=»»> текст </a>). Но есть и способ сделать это с помощью Rails. Этот метод не Ruby, а скорее часть фреймворка. При этом вы можете использовать его только во встроенных рубиновых HTML-файлах, а не в чистых rb-файлах. Так как нам это сделать? Вот код:

1
2
3
4
5
6
7
8
9
<html>
  <head>
  <title>Rails Link Demo</title>
  </head>
<body>
     
  <%= link_to(‘Another Action Link’, :controller => ‘learn’, :action => ‘another_action’)%>
  </body>
  </html>

На первый взгляд, вы можете задаться вопросом, почему вы когда-нибудь измените способ написания ссылок, особенно если замена дольше! Ну, одна из главных причин — читабельность. Вы можете легко прочитать это и точно знать, на что он будет ссылаться. Что касается длины, то часть: controller => не обязательна, если вы ссылаетесь на действие в том же контроллере.

С этим фрагментом кода рельсов мы также видим символы. «: Controller =>» является символом. Мы поговорим подробнее о том, что они делают позже, а сейчас просто узнаем двоеточие.

Ранее в этой серии мы немного поговорили о разумных значениях по умолчанию для рельсов. Одним из значений по умолчанию является создание представления, имя которого совпадает с именем действия в соответствующем представлении. Но что, если мы хотим перезаписать то, что автоматически делает рельсы? Это на самом деле довольно легко и очень полезная техника. Когда вы работаете над реальным проектом, вы можете представить, насколько «неуклюжим» будет ваш контроллер, если вам потребуется создать отдельное представление и действие в контроллере для каждой страницы. У Rails есть решение, которое называется рендерингом. Рендеринг позволяет указать, какой вид использовать для каждого действия. Имейте в виду, что, как и ссылки на rails, это также эксклюзивный код rails, а не ruby, предназначенный только для контроллера.

Если вышесказанное немного смутило вас, позвольте мне показать вам, как это сделать. Это, надеюсь, прояснит это немного. В этом первом примере мы собираемся отобразить действие в виде, которое оно обычно отображает в любом случае. Другими словами, этот код рендеринга ничего не делает без него. Все, что он делает, это показывает некоторый код, который обычно просто «предполагается».

1
2
3
def index
    render :action => ‘index’
end

Последний пример не очень полезен, поскольку в любом случае результат достигается автоматически. Но что, если у вас был действительно продвинутый вид для другого действия, и вы хотели такой же вид для другого действия. Было бы не только утомительно создавать другое идентичное представление для каждого создаваемого вами действия, но также было бы почти невозможно обновить! Все это может быть исправлено путем рендеринга каждого подобного действия определенному действию. Изучите следующий фрагмент кода, который я объясню позже, и обратите внимание на разные части.

text_controller.rb:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class LearnController < ApplicationController
     
    def index
        render :action => ‘text’
    end
     
    def text
        @text = ‘<u>Text</u>’
    end
     
    def other
        @text = ‘<b>Other</b>’
        render :action => ‘text’
    end
         
end

text.html.erb:

01
02
03
04
05
06
07
08
09
10
<html>
  <head>
  <title>Rails Rendering Demo</title>
  </head></p>
<body>
     
  <p>Welcome to the <%= @text %> Page</p>
</p>
</body>
  </html></p>

Индекс Действие

Возможно, вы заметили, что я включил действие под названием «индекс». Это действие будет просмотрено, если вы перейдете в каталог, чтобы «изучить». Он работает как обычный индексный файл. Вам не нужно создавать конкретное действие для индекса. Вы также можете использовать ранее рассмотренную тему наследования другого действия.

Рендеринг в тот же вид

Для этого примера нам нужен был только один вид для всех действий; и все они создали разные страницы. Для меня это невероятно для объема работы, которую мы выполняем.

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

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

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

Вы можете быть удивлены тем, сколько раз вы используете команду перенаправления. Вот несколько общих применений:

  • Создание псевдонимов страниц
  • Выполнение действия в контроллере с последующим перенаправлением на дополнительную страницу
  • Если есть ошибка, перенаправьте на страницу ошибки
  • Если пользователь не вошел в систему, отправьте его на страницу входа

Хватит болтать, давайте разберемся с кодом! Для этого примера кода мы просто изменим контроллер последнего примера и оставим представление таким же. Как вы увидите, перенаправление очень похоже по формату на рендеринг:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class LearnController < ApplicationController
     
    def index
        redirect_to :action => ‘text’
    end
     
    def text
        @text = ‘<u>Text</u>’
        redirect_to :action => ‘other’
    end
     
    def other
        render :action => ‘text’
    end
         
end

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

  • Сначала мы перенаправляем на текст действия. Как и при связывании в rails, вы также можете указать контроллер, если перенаправляете на другой контроллер. Вы бы просто поместили: controller => ‘learn’, перед действием.
  • Браузер теперь переходит к текстовому действию. Здесь он устанавливает значение для @text. Но браузер не имеет значения для @text. Это потому, что перенаправление по существу забывает все, что вы говорите в этом действии.
  • Мы сейчас перенаправлены на других. Здесь мы отрисовываем текстовое представление.

Хотя есть несколько очевидных сценариев, в которых вы бы предпочли либо визуализировать, либо перенаправлять; Там могут быть некоторые более сложные решения. Однако один важный ключ заключается в том, что если вы отправляете данные в базу данных или что-либо, что изменяет приложение, используйте перенаправление. В противном случае обновление может повторно отправить данные.

Надеюсь, вы, ребята, многому научились из этого урока! Мы рассмотрели много важных концепций, поэтому, если вы все еще что-то смущаете, перечитайте это. На следующей неделе мы, вероятно, перейдем к синтаксису ruby!

Как всегда, не стесняйтесь оставлять вопросы в комментариях. Также, пожалуйста, копайте эту статью, если она вам помогла!