Rails - обновить вид после отправки с другого контроллера - PullRequest
2 голосов
/ 21 марта 2011

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

У меня есть 2 модели: пользователи и элементы.У пользователей есть несколько элементов.

В представлении «Пользователи» отображаются все его элементы.В представлении у меня есть частичное представление всех элементов в отдельных строках таблицы:

<table class="items">
          <%= render @items%>
</table>

В том же представлении у меня есть элемент div, который используется для создания новых элементов, этот элемент содержит элементычастичный (который содержит форму для создания новых элементов):

<div id="new_item_dialog">
    <%= render :partial => '/items/new_items' %>
</div>

Этот div 'new_item_dialog' вызывается в диалог через jquery и имеет: remote => true для выполнения асинхронного создания элемента 'create':

$('#open-dialog').click(function(){
    $item_dialog.dialog('open');
});

$('.item_submit').click(function(){
    $item_dialog.dialog('close');       
});

Проблема, с которой я сталкиваюсь, заключается в обновлении пользовательской страницы 'show' после отправки нового элемента.

Простое перенаправление на пользователяshow page из контроллера элемента 'create' не обновляет данные

  def create
    @user = cur_user
    @item = @user.items.build(params[:item])
    if @item.save
      redirect_to @user
    else 
      render 'new'
    end

Я также пытался использовать jQuery для загрузки новых данных:

$('.new_item').bind('ajax:success', function()
{
    $.get('/items/new_item', function (html) {
               $('.items').html(html);
           });
});

Но я получаю ошибкусообщение:

ActionView::MissingTemplate (Missing template items/show with 

Любая помощь будет принята с благодарностью!

Примечание. Я также попытался выполнить команду render @user после сохранения элемента в контроллере создания элемента.повторно визуализировать пользовательское представление 'show', но яТа же ошибка «MissingTemplate», что и выше.

Обновлено: Также пробовал:

def create
    @user = cur_user
    @task = @user.item.build(params[:item])
    if @item.save
      render :partial => "items/item"

И (заменяя рендер в вышеприведенном контроллере)

render :partial => @item

И

render :partial => 'views/items/item', :collection => @user.items

И

render :partial => 'views/items/item', :locals => { :variable => @item}

И

render :action => 'users/show', :layout => 'users'

Каждый из них вернул ошибку:

ActionView::MissingTemplate (Missing template ..... with {:locale=>[:en, :en], :formats=>[:js, :"*/*"], :handlers=>[:rhtml, :rxml, :builder, :erb, :rjs]} in view paths "test/app/views"):
  app/controllers/items_controller.rb:11:in `create'

С Ajax, подобным этому: (хотя никогда не привыкаешь, при рендеринге партиала ничего не получается)

$('.new_item').bind('ajax:success', function()
    {
        $.ajax({
              success: function(html){
                $(".items").html(html);
              }
        });
    });

1 Ответ

1 голос
/ 21 марта 2011

Либо вы обновляете всю страницу путем перенаправления (не рендеринга) с использованием redirect_to user_path (@user)

OR

вы можете вернуть частичные элементы при создании элемента. что происходит, это:

  1. создать элемент, отправив форму через ajax
  2. элемент создан в вашем контроллере, рендер: частичный => "/ path / to / item"
  3. вы получите html, поэтому в вызове ajax вашего jquery поместите функцию успеха, которая заменит ваш текущий частичный

    $. Аякс ({... ... success: function (html) { . $ ( "") Элементы HTML (HTML); // вы также можете использовать replaceWith (html), если вы хотите просто визуализировать всю таблицу снова, но поместить таблицу в частичное });

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