1

如果验证失败,我正在尝试让非模型 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

谢谢,

史蒂夫

4

2 回答 2

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 %>

然后在您的控制器操作中,您想要重新渲染该操作(这可能是创建中的“新”和更新中的“编辑”):

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

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

使用“编辑”模板进行创建:

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

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

于 2012-06-12T18:28:58.313 回答
0

如果您要更新现有记录(不是新记录),您希望改为呈现edit模板。

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

所以替换render(:update)render(:new),你应该很高兴。

希望有帮助。

于 2012-06-11T11:03:36.267 回答