表单提交在与当前 View 不同的 Controller 上创建项目后,我无法刷新 View 。
我有 2 个模型,用户和项目。用户有多个项目。
用户“显示” View 列出了其所有项目。在 View 中,我有一个部分用于将所有项目渲染到单独的表行中:
<table class="items">
<%= render @items%>
</table>
在同一个 View 中,我在底部有一个用于创建新项目的 div,该 div 包含一个 Items 部分(其中包含用于创建新项目的表单):
<div id="new_item_dialog">
<%= render :partial => '/items/new_items' %>
</div>
此“new_item_dialog”div 通过 jquery 弹出到对话框中,并具有 :remote => true 来执行异步项目“创建”:
$('#open-dialog').click(function(){
$item_dialog.dialog('open');
});
$('.item_submit').click(function(){
$item_dialog.dialog('close');
});
我遇到的问题是在提交新项目后刷新用户的“显示”页面。
从项目的“创建” Controller 到用户的显示页面的简单重定向不会刷新数据
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
任何帮助将不胜感激!
注意:在将项目保存在项目的“创建” Controller 中后,我还尝试了“渲染@user”,以重新渲染用户的“显示” View ,但我得到了与以下相同的“MissingTemplate”错误如上所述。
更新: 还尝试过:
def create
@user = cur_user
@task = @user.item.build(params[:item])
if @item.save
render :partial => "items/item"
并且(替换上面 Controller 中的渲染)
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);
}
});
});
最佳答案
您可以使用redirect_to user_path(@user)重定向(而不是渲染)来刷新整个页面
或者
您可以在创建项目时部分返回项目。发生的事情是这样的:
- 通过ajax提交表单来创建项目
- item 在您的 Controller 中创建,渲染 :partial => "/path/to/item"
您将收到 html,因此在 jquery 的 ajax 调用中放置一个成功函数来替换当前的部分
$.ajax({... ... 成功:函数(html){ $(".items").html(html);//如果你想再次渲染整个表格,但将表格放在部分表格中,也可以使用replaceWith(html) });
关于jquery - Rails - 从不同 Controller 提交后刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5373844/