ユーザーがアナウンスの投稿を作成できるようにするユーザーページを持つ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
コンソールでアナウンスを手動で作成できることを確認しました。私は何が間違っているのですか?
@announcement
がAnnouncementsController#create
に保存できない場合は、アクションのデフォルトビューをレンダリングします。この場合はcreate.html.erb
は存在しません。したがって、表示されているエラーが発生します。
通常、作成アクションは、フォームを使用してテンプレートを再レンダリングします。通常、これはnew
アクションです。これは、else
アクションのcreate
部分にrender "new"
を追加することを意味します。
ただし、あなたの場合は、"shared/announcements_form"
部分にあるようです。つまり、追加することになります。
render "shared/announcements_form"
create
アクションに。
アナウンスが正常に保存されたときに行っているように、そのelse
ブロックにredirect_to
またはrender "shared/announcements_form"
を配置すると、問題が解決します。
作成しようとしているアナウンスは保存に失敗するため、else
ブロックが実行され、これがannouncements/create.html.erb
をレンダリングしようとします。慣例により、アクションに明示的なrender
がない場合、Railsは、そのアクションに対応するビューをレンダリングしようとします。
パスを確認し、ファイル名だけでなくフルパスのスペルが正しいことを確認します(つまり、フォルダー)。フォルダ名のタイプミスを修正した後、それは機能しました。