render:update给出了MissingTemplate错误

时间:2012-06-11 10:39:27

标签: ruby-on-rails

如果验证失败,我正试图让非模型form_for重新加载。包含表单的页面(app / views / sites / devices.html.erb)包含将表单加载为模板的代码

<div id="site-device-form">
   <%= render partial: "shared/site_device_form", locals: {site: @site, site_device: @site_device} %>
 </div>

然后表单以内嵌方式显示为呈现的部分:

<%= form_for(:site_device, :url => {:controller=>"site_devices", :action=>"create"}) do |f| %>
  <tr>
    <%= f.hidden_field :site_id, :value => site.id %>
    <!-- etc -->
  </tr>
<% end %>

因此表单最初是从SitesController页面实例化的,但是当它创建SiteDevice时,表单调用SiteDevicesController #create方法来创建页面。

SiteDevice有一些验证码 - 所以如果它失败了怎么办?我正在尝试重新加载页面,因此表单代码只是重新显示(我们将在重新显示时显示错误)

  if @site_device.save
     flash[:notice] = 'SiteDevice was successfully created.'
     format.html { redirect_to(@site_device) }
  else
     #re-render form
     format.html { render(:update) do |page|
                      page[:site-device-form].replace_html partial: 'shared/site_device_form'
                   end  }
  end

根据我的理解,render(:update)应该渲染块,传入页面模板。但我得到的是一个ActionView :: MissingTemplate错误:

ActionView::MissingTemplate (Missing template site_devices/update, application/update with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* "/home/ruby/frontier_development/Frontier/app/views"

任何想法在这里出了什么问题?如何获得渲染:根据我给出的部分更新div-id

谢谢,

史蒂夫

2 个答案:

答案 0 :(得分:0)

如果您要更新现有记录(不是新记录),则需要呈现edit模板。

对于新记录,您将呈现new模板。

所以用render(:update)替换render(:new),你应该好好去。

希望有所帮助。

答案 1 :(得分:0)

据我记得并且可以看出,render:update是一种执行脚本块(rjs)的方法,我不确定你是否真的想要走那条路。因此,根据我们的评论,我假设你可能想要做以下的事情,以便在重新渲染模板时显示你的div。

<% if @some_flag %>
  <div id="site-device-form">
     <%= render partial: "shared/site_device_form", locals: {site: @site, site_device: @site_device} %>
   </div>
<% end %>

然后在您的控制器操作中,您希望重新呈现操作(在创建中可能是“新”并且在更新中“编辑”):

使用“new”模板进行创建:

def create
  ...
  if @site_device.save
     ...
  else
    #set the flag for the view and re-render the template
    format.html { 
       @some_flag = true
       render action: "new"
     }
  end
end

使用create:

的“编辑”模板
def update
  ...
  if @site_device.update_attributes(...)
     ...
  else
    #set the flag for the view and re-render the template
    format.html { 
       @some_flag = true
       render action: "edit"
     }
  end
end

这只是要点...它可能会帮助你走上正确的轨道(如果我已正确理解你的问题)。