検証が失敗した場合、モデル以外の 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 を更新するためにレンダーを取得するにはどうすればよいですか
ありがとう、
スティーブ