4

シナリオをセットアップしてから、詳細に質問します。

シナリオは次のとおりです。

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行のソリューションにすぎません。なぜこれが起こっているのかを裏付ける言葉、または物事のより良い/正しい方法を支持する言葉をいただければ幸いです。

さらに情報/特定のコードが必要な場合は、お知らせください。

4

1 に答える 1

2

解決策は次のとおりです。

「social.html.erb」をコピーして「/contact/new.html.erb」に貼り付けます

次に、その特定のレンダリングを次のように変更します。

<%= render 'form' %>    # that's ok now, because you are in the right directory

今routes.rbで:

resources :contacts     # it's important to add this for RESTful architecture

match 'social' => 'contact#new' # and DELETE the other line with => 'contact#index' because it is no more necessary

それだけでした。

更新:ここにあなたの問題の私のgithub-solutionがあります(あなたのアプリケーション内)

https://github.com/rubybrah/solution
于 2013-05-11T19:28:24.410 に答える