Rails - 从不同的控制器提交后刷新视图

时间:2011-03-21 04:36:46

标签: jquery ruby-on-rails ruby-on-rails-3

表单提交在与当前视图不同的控制器上创建项目后,我无法刷新视图。

我有2个型号,用户和物品。用户有多个项目。

“用户节目”视图列出了其所有项目。在视图中,我有一部分用于将所有项呈现为单独的表行:

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

在同一视图中,我在底部有一个用于创建新项目的div,此div包含Items partial(包含用于创建新项目的表单):

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

此'new_item_dialog'div通过jquery弹出到对话框中,并具有:remote =&gt;如果执行项'创建'异步:

,则为true
$('#open-dialog').click(function(){
    $item_dialog.dialog('open');
});

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

我遇到的问题是在提交新商品后刷新用户的“展示”页面。

从Item的'create'控制器向用户的显示页面进行简单的redirect_to不会刷新数据

  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 

非常感谢任何帮助!

注意:在项目的“创建”控制器中保存项目之后,我还尝试了“渲染@user”,以重新渲染用户的“显示”视图,但是我得到了相同的“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 个答案:

答案 0 :(得分:1)

使用redirect_to user_path(@user)

通过重定向(不呈现)刷新整个页面

OR

您可以在创建项目时返回部分项目。会发生什么:

  1. 通过ajax
  2. 提交表单来创建项目
  3. 项目在您的控制器中创建,渲染:partial =&gt; “/路径/到/项目”
  4. 你将在你的jquery的ajax调用中收到html,把一个成功函数替换为你当前的部分

    $。AJAX({... ... 成功:function(html){   $( “项目”)HTML(HTML); //如果你想再次渲染整个表,你也可以使用replaceWith(html),但是把表放在局部 });