рельсы response_to и различные формы HTML-ответов - PullRequest
5 голосов
/ 12 мая 2010

Я часто пользуюсь

respond_to do |format|
...
end

в Rails для моих действий Restful, но я не знаю, какое идеальное решение для обработки различных форм, скажем, html-ответов. Например, view1, который вызывает действие A, может ожидать возврата html со списком виджетов, заключенных в тег UL, в то время как view2 ожидает тот же список виджетов, заключенный в таблицу. Как можно выразить Restly, что я не только хочу вернуть ответ в формате html, но я хочу, чтобы он был обернут в таблицу или в UL, OL, опции или в какой-либо другой общий HTML-тег, ориентированный на список?

Ответы [ 3 ]

3 голосов
/ 12 мая 2010

Это основная идея:

Контроллер

class ProductsController < ApplicationController

  def index

    # this will be used in the view
    @mode = params[:mode] || 'list'

    # respond_to is used for responding to different formats
    respond_to do |format|
      format.html            # index.html.erb
      format.js              # index.js.erb
      format.xml do          # index.xml.erb
        # custom things can go in a block like this
      end
    end
  end

end

Просмотры

<!-- views/products/index.html.erb -->
<h1>Listing Products</h1>

<%= render params[:mode], :products => @products %>


<!-- views/products/_list.html.erb -->
<ul>
  <% for p in products %>
  <li><%= p.name %></li>
  <% end %>
</ul>


<!-- views/products/_table.html.erb -->
<table>
  <% for p in products %>
  <tr>
    <td><%= p.name %></td>
  </tr>
  <% end %>
</table>

Использование:

Вы можете связать другие режимы просмотра, используя:

<%= link_to "View as list",   products_path(:mode => "list") %>
<%= link_to "View as table",  products_path(:mode => "table") %> 

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

0 голосов
/ 12 мая 2010

Изучите этот вариант маршрута по умолчанию:

 map.connect ':controller/:action/:id.:format'

Обратите внимание, что он позволяет вам установить формат, передавая его как расширение. У меня иногда есть приложения с несколькими потребителями, которые требуют различных форматов XML, например.

Так, например, в одном месте приложение iphone использует формат «xmlm» (для XML Mobile), а потребитель java использует «xml», потому что оно работает с полной сериализацией. Это позволяет мне использовать этот индикатор в качестве формата верхнего уровня.

respond_to do |format|
 format.xml{  render :xml => @people.to_xml  }
 format.xmlm { do other stuff }
end

Эта страница будет вам полезна и содержит всю информацию, необходимую для реализации этого материала (обратите внимание, в частности, на часть о пользовательских типах пантомимы), обязательно прочитайте комментарии: http://apidock.com/rails/v2.3.4/ActionController/MimeResponds/InstanceMethods/respond_to

0 голосов
/ 12 мая 2010

Я думаю, что вы здесь не на том пути. Прежде всего, представления не вызывают действия, это наоборот. Во-вторых, response_to используется для отображения совершенно другого формата (то есть html, xml, js и т. Д.), А не другого шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...