2013-05-29 3 views
44

Я прочитал его из направляющих рельсов, Посмотрели на Мичил Härtel книги и теперь читает его из Rails Посмотреть книгу, но все-таки я запутаться :(разница между Рендер и Рендер Частичное и выход

Существует _footer.html.erb файл так что это «частичная» и в коде он написал:.

<%=render 'layouts/footer' %> 

так я понимаю, что, когда он видит это, идет и вставьте HTML-код для колонтитула файла здесь Ok ... Теперь несколько страниц позже говорится:

<%= render partial: 'activitiy_items/recent' %> 

поэтому ПОЧЕМУ на этот раз у нас есть слово «частичный» здесь, но у нас его не было в предыдущем?

И там где-то я вижу <%= yield :sidebar %>

Так это yield также вставить HTML на своем месте? Ну, не так ли было render?

Я надеялся, что если другой программист вместо книг объясняет это мне, может быть, я на этот раз :)

ответ

87

render & render partial:

  • render 'some_view' является обобщающим для render partial: 'some_view'.
  • render file: 'view' будет искать файл view.html.erb и НЕ _view.html.erb (.erb или любой другой визуализатор вы используете)
  • render не будет принимать дополнительные локальные переменные для частичного, вам нужно использовать render partial: следующим за что:

    render partial: 'some/path/to/my/partial', locals: { custom_var: 'Hello' } 
    

(http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables)

yield & content_for

  • yield обычно используется в макетов. Он сообщает Rails о размещении контента для этого блока в , который место в макете.
  • Когда вы делаете yield :something, связанный с content_for :something, вы можете передать блок кода (просмотреть), чтобы показать, где находится yield :something (см. Пример ниже).

Небольшого пример о выходе:

В макете:

<html> 
<head> 
<%= yield :javascript_head %> 
</head> 
<body> 
<div id="sidebar"> 
    <%= yield :sidebar %> 
</div> 
</body> 

В одном из вашего зрения:

<% content_for :sidebar do %> 
    This content will show up in the sidebar section 
<% end %> 

<% content_for :javascript_head do %> 
    <script type="text/javascript"> 
    console.log("Hello World!"); 
    </script> 
<% end %> 

Это будет производить следующее HTML:

<html> 
<head> 
    <script type="text/javascript"> 
    console.log("Hello World!"); 
    </script> 
</head> 
<body> 
<div id="sidebar"> 
    This content will show up in the sidebar section 
</div> 
</body> 

сообщений, которые могут помочь:

Ссылки на документацию & инструкций:

+0

В дополнение к его ответу, посмотрите на это для справки: http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-partials – David

+0

Хорошо спасибо, но все-таки какая разница между Render и Yield в макете ? Они оба вставляют HTML? –

+0

Таким образом, рендер и доходность рендеринга HTML и его вставка? –

3

О рендер, оказывают: частичное и дают

  • визуализации: шаблон и сделать: частично два файла в рельсах ..


    визуализации: шаблон в основном созданы в соответствии с действием, с синтаксической demo.html.erb

    визуализации: частично являются многоразовые и вызываются из различных точек зрения, являются общими для многих страниц в приложении и синтаксисе _demo.html.erb

  • выход и делают ..


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

+0

Это грубо неверно относительно синтаксиса рендера: partial - render: partial - это расширенная форма и принимает локальные переменные as Г-н Йошиджи написал выше .. «\ _» - это частичные, которые НЕ являются действиями .. все действия (определенные в контроллере) записываются без префикса («_»). Вы можете вызывать рендеринг по любому определенному имени единственной/множественной модели используя конвейеры рельсов –

-1

Некоторые разработчики думают о redirect_to как о своей команде goto, перемещая исполнение из одного места в другое в вашем Rails-коде. Это неверно. Ваш код перестает работать и ждет нового запроса для браузера. Просто случается, что вы сказали браузеру, какой запрос он должен сделать дальше, отправив код статуса HTTP 302.

Рассмотрим эти действия, чтобы увидеть разницу:

def index 
    @books = Book.all 
end 

def show 
    @book = Book.find_by(id: params[:id]) 
    if @book.nil? 
    render action: "index" 
    end 
end 

С кодом в такой форме, вероятно, будет проблемой, если переменная @book равна нулю. Помните, что render :action не запускает какой-либо код в целевом действии, поэтому ничто не будет настраивать переменную @books, которая, вероятно, потребует индекс. Один из способов исправить это перенаправить вместо рендеринга:

def index 
    @books = Book.all 
end 

def show 
    @book = Book.find_by(id: params[:id]) 
    if @book.nil? 
    redirect_to action: :index 
    end 
end 

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

Единственный недостаток этого кода в том, что он требует двусторонней поездки в браузер: браузер запросил действие шоу с помощью/books/1, и контроллер обнаружил, что книг нет, поэтому контроллер отправляет перенаправление 302 ответ на браузер, говорящий ему перейти в/books /, браузер отвечает и отправляет новый запрос обратно на контроллер, запрашивая теперь действие индекса, контроллер затем получает все книги в базе данных и отображает шаблон индекса, отправляет его вернитесь к браузеру, который затем отобразит его на экране.

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

def index 
    @books = Book.all 
end 

def show 
    @book = Book.find_by(id: params[:id]) 
    if @book.nil? 
    @books = Book.all 
    flash.now[:alert] = "Your book was not found" 
    render "index" 
    end 
end 

Это определит, что нет книг с указанным идентификатором, заселить @books переменного экземпляра со всеми книгами в модели, а затем непосредственно визуализируйте шаблон index.html.erb, возвращая его в браузер с сообщением о флэш-оповещении, чтобы сообщить пользователю, что произошло.

+0

Этот ответ не имеет отношения к вопросу. –

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