web-dev-qa-db-ja.com

欠落しているテンプレートエラーを修正するにはどうすればよいですか?

ユーザーがアナウンスの投稿を作成できるようにするユーザーページを持つWebサイトを作成しています。

Webサイトから新しいアナウンス投稿を作成しようとすると、次のようなエラーが表示されます。

Template is missing
Missing template announcements/create, application/create with {:locale=>[:en],     :formats=>[:html], :handlers=>[:erb, :builder, :raw, :Ruby, :jbuilder, :coffee]}. Searched in: * ".../app/views"

その場所にcreate.html.erbを作成すると、フォームはいつものようにfalseを返します。

ユーザーページ(/app/view/users/show.html.erb):

<% provide(:title, 'Admin Page') %>

<% if signed_in? %>
  <div class="container">
    <%= link_to "Sign out", signout_path, method: "delete" %>
    <br />

     <% if @announcements.any? %>
      <h3>Announcements (<%= @announcements.count %>)</h3>
      <ol>
        <%= render @announcements %>
      </ol>
      <%= will_paginate @announcements %>
    <% end %>

      <%= render 'shared/announcement_form' %>
  </div>

<% else %>
<script type="text/javascript"> window.location.href= '<%= signin_path %>' </script>
<% end %>

shared/_announcement_form.html.erb:

<%= form_for(@announcement) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

   <div class="field">
    <%= f.text_area :title, placeholder: "Compose new title..." %>
  </div>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new announcement..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

UsersController:

class UsersController < ApplicationController
  def new
  end

  def show
    @user = User.find(params[:id])
    @announcement = current_user.announcements.build if signed_in?
    @announcements = @user.announcements.paginate(:page => params[:a_page], :per_page  => 10)
  end
end

AnnouncementsController:

class AnnouncementsController < ApplicationController
  before_action :signed_in_user, only: [:create, :destroy]

  def create
    @announcement = current_user.announcements.build(announcement_params)

    if @announcement.save
      flash[:success] = "Announcement created!"
      redirect_to root_url
    else
      flash[:error] = "Failed to create announcement!"
    end
  end

  def destroy
  end

  private

  def announcement_params
    params.require(:announcement).permit(:content)
    params.require(:announcement).permit(:title)
  end
end

コンソールでアナウンスを手動で作成できることを確認しました。私は何が間違っているのですか?

8
user2737114

@announcementAnnouncementsController#createに保存できない場合は、アクションのデフォルトビューをレンダリングします。この場合はcreate.html.erbは存在しません。したがって、表示されているエラーが発生します。

通常、作成アクションは、フォームを使用してテンプレートを再レンダリングします。通常、これはnewアクションです。これは、elseアクションのcreate部分にrender "new"を追加することを意味します。

ただし、あなたの場合は、"shared/announcements_form"部分にあるようです。つまり、追加することになります。

render "shared/announcements_form"

createアクションに。

10
Jakob S

アナウンスが正常に保存されたときに行っているように、そのelseブロックにredirect_toまたはrender "shared/announcements_form"を配置すると、問題が解決します。

作成しようとしているアナウンスは保存に失敗するため、elseブロックが実行され、これがannouncements/create.html.erbをレンダリングしようとします。慣例により、アクションに明示的なrenderがない場合、Railsは、そのアクションに対応するビューをレンダリングしようとします。

1
Agis

パスを確認し、ファイル名だけでなくフルパスのスペルが正しいことを確認します(つまり、フォルダー)。フォルダ名のタイプミスを修正した後、それは機能しました。

0
ashwin tang