2012-06-11 3 views
1

유효성 검사에 실패하면 다시로드 할 수있는 모델이 아닌 form_for을 얻으려고합니다.render : MissingTemplate 오류가 발생했습니다.

<%= form_for(:site_device, :url => {:controller=>"site_devices", :action=>"create"}) do |f| %> 
    <tr> 
    <%= f.hidden_field :site_id, :value => site.id %> 
    <!-- etc --> 
    </tr> 
<% end %> 
: 양식 (응용 프로그램/뷰/사이트/devices.html.erb)를 포함하는 페이지는 렌더링 부분으로 인라인 표시 템플릿

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

양식으로 양식을로드하는 코드를 포함

이 양식은 처음에 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" 

어떤 아이디어가 잘못 되었나요? 어떻게에 렌더링받을 수 있나요 : 나는 그것을 준 부분에 따라 사업부-ID를 업데이트를

감사합니다,

스티브

+0

여기서 보여주는 것은 페이지를 다시 렌더링하지 않고 저장에 실패하면 일부 j를 실행하는 것입니다. 그렇다면 format.html {}에서 format.js {} 블록이 필요하지만, 요청을 XHR로 변경해야 할 가능성이 있는지 확신 할 수 없습니다.양식을 표시하기 위해 인스턴스 변수로 전체 페이지 (템플리트)를 다시 렌더링하는 것이 더 쉬울 수도 있습니다. – miked

+0

안녕하세요. 귀하의 회신에 감사드립니다. 렌더링해야하는 JS입니까? 유효성을 검사하지 못했을 때 양식의 부분을 다시 렌더링해야한다고 생각했습니다. 양식의 부분 템플리트는 모델 오류 (처음에는 비어 있음)를 양식 표시의 일부로 표시합니다. 따라서 유효성 검사가 실패하면 모델 오류는 이제 비어 있지 않습니다. 그래서 내 생각에 나는 폼을 다시 렌더링하기 만하면됩니다. 폼은 오류가 나타나고 나타나야하므로 수정할 수 있습니다. 사물에 접근하는 것이 잘못된 방법일까요? XHR : 이것은 render (: update)가 (PragProg Rails 서적의 p325에 따라)해야하는 것이 아닙니다. Thxs, Steve –

+0

안녕하세요 steve ... render : update 대신에 render : action을 사용하면 효과가 있다고 생각되는 솔루션을 추가했습니다. – miked

답변

0

기존 기록 (안 새 레코드를 업데이트하는 경우) 대신 edit 템플릿을 렌더링하려고합니다.

새 레코드의 경우 new 템플릿을 렌더링합니다.

render(:update)render(:new)으로 바꿔야합니다.

희망이 있습니다.

+0

안녕 Matenia. 응답을위한 Thxs. 그래서 내가 올바르게 이해한다면 render (: update) do | page | 현재 뷰를 업데이트하지 않고 업데이트 뷰를 로컬 변수 페이지로 블록에 전달합니다. 페이지로 가져와 기존 뷰를 기본으로 사용하도록 렌더링하려면 어떤 인수를 사용해야합니까? Thxs, Stve –

+0

그냥'render' 해보고 도움이되는지보십시오. –

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 

이것은 단지 요점에 불과합니다 ... 올바른 길을 찾는데 도움이 될 수 있습니다 (문제가 올바르게 이해 된 경우).

관련 문제