2013-09-01 14 views
3

我正在制作一个网站,该网站有一个用户页面,该页面应该允许用户创建公告帖子。如何修复缺少的模板错误?

当我尝试创建通过网站新公告后,一个错误弹出如下:

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 %> 

共享/ _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 

公告控制器:

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 

我检查了我可以在控制台中手动创建通告。我究竟做错了什么?

回答

7

如果@announcement无法保存在AnnouncementsController#create中,则呈现操作的默认视图 - 在此例中create.html.erb不存在。因此,你会看到你所看到的错误。

通常,创建操作将使用表单重新呈现模板。通常这是new操作,这意味着要将render "new"添加到您的create操作的else部分中。

你的情况然而,现在看来似乎是在"shared/announcements_form"部分,这将意味着增加

render "shared/announcements_form" 

create行动。

+0

谢谢,虽然把渲染“共享/ _announcements_form”仍然创建相同的“模板错误”,但我明白了。 我添加了“redirect_to:back”,它的效果更好,因为_announcements_form.html.erb是users/show.html.erb的一部分,并且某种程度上render或redirect_to“users/show”会导致另一个错误。 此外,公告未能保存的原因是,announcement_params应该在一行params.require(:announcement).permit(:title,:content)中,不能分成两部分。 – user2737114

1

redirect_torender "shared/announcements_form"放入else块中,就像您在播放声明成功保存时所做的那样会解决问题。

您试图创建的声明无法保存,因此将执行else块,并尝试渲染announcements/create.html.erb。按照惯例,如果动作中没有任何明确的render,则Rails会尝试呈现与该动作对应的任何视图。

0

检查您的路径,确保您的完整路径拼写正确(即文件夹)不只是文件名。修复我的文件夹名称中的错字后,它的工作。