如果验证失败,我正试图让非模型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
谢谢,
史蒂夫
答案 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
这只是要点...它可能会帮助你走上正确的轨道(如果我已正确理解你的问题)。