2012-06-11 20 views
1

如果驗證失敗,我試圖獲取非模型form_for重新加載。包含表單(APP /視圖/位點/ devices.html.erb)該頁面包含代碼來加載的形式作爲模板render:update給出MissingTemplate錯誤

<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 

(我們會得到顯示一次重新顯示作品中的錯誤),渲染(:更新)應該呈現塊,傳入頁面模板。但我得到的是一個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

你在這裏展示的是你不想重新渲染頁面,但只是執行一些js,如果保存失敗?如果是這樣,我不確定您可以在format.html {}內執行此操作 - 可能需要format.js {}塊,但您的請求可能必須更改爲XHR。使用實例變量重新呈現整個頁面(模板)以顯示錶單可能會更容易。 – miked

+0

嗨miked。感謝您的答覆。是JS我需要渲染 - 我想我只需要重新渲染表單的部分時,它無法驗證?表單的部分模板將模型錯誤(最初爲空)作爲表單顯示的一部分。所以如果驗證失敗,模型錯誤現在是非空的。所以我的想法是,我只是重新渲染表單,現在應該顯示錯誤,以便糾正錯誤。這是處理事情的錯誤方式嗎? XHR:這不是render(:update)應該做的(按照PragProg Rails書的p325)。 Thxs,Steve –

+0

嗨史蒂夫...我添加了一個解決方案,我認爲可能會爲你使用render:action而不是render:update。 – miked

回答

0

如果要更新現有的記錄,(不是一個新紀錄),您想改爲渲染edit模板。

對於新記錄,您將呈現new模板。

所以用render(:new)替換render(:update),你應該很好走。

希望有所幫助。

+0

嗨Matenia。 Thxs的迴應。所以如果我理解正確,render(:update)do | page |將更新視圖作爲本地變量頁面傳遞到塊中,而不是更新當前視圖。頁面來獲取它,那麼我將使用什麼參數來渲染它,告訴它使用現有視圖作爲基礎? Thxs,Stve –

+0

只需嘗試渲染,看看是否有幫助。 –

0

據我記得,可以告訴,渲染:更新是一種執行腳本塊(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 

這只是要點......它可能會幫助你走上正確的軌道(如果我已經正確地理解了你的問題)。