シナリオをセットアップしてから、詳細に質問します。
シナリオは次のとおりです。
new アクションと create アクションを備えた連絡先コントローラーがあります。これは、ユーザーに記入して回答を保存してもらいたいフォーム用です。
接触コントローラー:
class ContactController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(params[:contact])
respond_to do |format|
if @contact.save
format.html { redirect_to social_path, notice: 'Message sent successfully!' }
else
format.html { render action: 'new' }
end
end
end
end
対応する _form.html.erb パーシャルと new.html.erb ビューがあり、フォームを部分的にレンダリングします。これらのビューはすべて、連絡先ビュー フォルダー内にあり、対応するルートがあります。
_form.html.erb
<%= form_for @contact do |f| %>
<% if @contact.errors.any? %>
<h2>
<%= pluralize(@contact.errors.count, "error") %> prohibited this contact from being saved:
</h2>
<ul>
<% @contact.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
<% end %>
<div class="row collapse">
<div class="large-2 columns">
<%= f.label :name, :class => 'inline' %>
</div>
<div class="large-10 columns">
<%= f.text_field :name, :placeholder => 'Kenny Powers' %>
</div>
</div>
<div class="row collapse">
<div class="large-2 columns">
<%= f.label :subject %>
</div>
<div class="large-10 columns">
<%= f.text_field :subject %>
</div>
</div>
<div class="row collapse">
<div class="large-2 columns">
<%= f.label :email %>
</div>
<div class="large-10 columns">
<%= f.text_field :email, :placeholder => 'kennypowers@example.com' %>
</div>
</div>
<div class="row collapse">
<div class="large-2 columns">
<%= f.label :message %>
</div>
<div class="large-10 columns">
<%= f.text_area :message %>
</div>
</div>
<div class="row collapse">
<div class="large-2 columns end">
<%= f.submit %>
</div>
</div>
<% end %>
new.html.erb <%= render 'contact/form' %>
ほとんど静的なページを動的コンテンツをロードするページから分離したかったので、 static_pages コントローラーを作成しました。
static_pages コントローラーの内部には、空のソーシャル コントローラー アクションがあります。static_pages ビュー フォルダーにある social.html.erb に静的コンテンツを表示しています。マッチ ルートは次のとおりです。
match 'social' => 'static_pages#social'
social.html.erb
<%= render :template => 'contact/new', :@contact => Contact.new %>
static_pages_controller
def social
end
かっこいい、ソーシャル ページは完璧にレンダリングされます。
今、混乱している部分について:
ソーシャル ページで連絡先フォームをレンダリングするにはどうすればよいですか? それは私が持っているsocial.html.erbファイルにあるので
<%= render template: 'contact/new' %>
それは私に与えます
ActionView::MissingTemplate in Static_pages#social
Showing app/views/contact/new.html.erb where line #1 raised:
1: <%= render 'form' %>
contact/new.html.erb で _form.html.erb のテンプレートが見つからないというエラーがスローされます。追加してフォームの場所を指定しようとすると
<%= render 'contact/form' %>
undefined method model_name for NilClass:Class
エラーが発生します。
私はこれを完全に間違っていますか?私が試みていることを行うためのより良い方法はありますか? 誰かが私に素人の説明を提供できますか?
フォームのパーシャルを他のコントローラーにレンダリングすることに関して同様の質問があることは知っていますが、それらは1行のソリューションにすぎません。なぜこれが起こっているのかを裏付ける言葉、または物事のより良い/正しい方法を支持する言葉をいただければ幸いです。
さらに情報/特定のコードが必要な場合は、お知らせください。