Сухой способ построить страницу с несколькими блоками (с разных контроллеров) и ajax в рельсах - PullRequest
2 голосов
/ 07 октября 2011

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

Какой самый лучший, сухой, рельсовый способ построить такую ​​конструкцию?

Это в моем article_controller.rb:

def line
  @articles = Article.filter(params)
  respond_to do |format|
    format.html { render :layout => false, :partial => "articles/line.html", :locals => {:articles => @articles} }
    format.json { render :json => { "html" => render_to_string(:partial => "articles/line.html", :locals => {:articles => @articles}) } }
  end
end

Когда я вызываю / article / line через ajax, он отправляет json, содержащий фрагмент html-кода, и все, что остается, - это добавить его в указанный div. Это работает. Когда я вызываю / article / line напрямую, это также работает и отображает необходимую часть html-кода.

Но что я должен написать в моем main_controller (он должен собирать и отображать все блоки с разных контроллеров)? Куда мне записать некоторые настройки блоков (например, количество записей и смещение, они требуются как в статическом, так и в ajax-случаях)?

Самое удобное для меня - настроить все прямо в шаблоне представления главной страницы, например:

<div id="last-news" data-params="{offset:0,limit:5}">
  <%= render #here we get html from :controller => news, :action => list, :params => get them from parent div %>
</div>
<div id="last-articles" data-params="{offset:0,limit:10}">
  <%= render #here we get html from :controller => articles, :action => list, :params => get them from parent div %>
</div>

Но это не похоже на MVC.

...