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

(新しいレコードではなく) 既存のレコードを更新する場合は、edit代わりにテンプレートをレンダリングする必要があります。

new新しいレコードの場合、テンプレートをレンダリングします。

したがって、に置き換えれば、render(:update)準備完了です。render(:new)

それが役立つことを願っています。

于 2012-06-11T11:03:36.267 に答える
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 に答える