【问题标题】:Missing templates from new Rails 3 app?新的 Rails 3 应用程序缺少模板?
【发布时间】:2010-07-23 15:05:32
【问题描述】:

刚刚尝试在我的模型中编写一个简单的 validates_presence_of,当错误尝试呈现时,它会调用:

Template is missing

Missing template posts/create with {:locale=>[:en, :en], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml, :haml], :formats=>[:html]} in view paths "/Users/johnsmith/Sites/shwagr/app/views"

Rails3 中的错误没有单独的视图,是吗?我认为那是 Rails 的魔法..

想知道是否有人遇到过这个问题,或者知道如何正确验证。

我的模特:

validates_presence_of :category, :name, :url

我的控制器:

def new
  @post = Post.new

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @post }
  end
end


def create
  @post = Post.new(params[:post])
  if @post.valid? && current_user.posts << @post
    respond_to do |format|
      if @post.save
        format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end
end

更新

有趣的是,我“触摸 app/views/posts/create.html.haml”,现在它删除了错误并改为加载该页面。但为什么会呢?或者更重要的是,我怎样才能让它像它应该的那样重定向回 new_post_path(@post)?

【问题讨论】:

    标签: ruby-on-rails ruby validation ruby-on-rails-3


    【解决方案1】:

    如果你的

    if @post.valid? && current_user.posts << @post
    

    line 返回 false,没有调用 render() 或 redirect_to()。 Rails 的默认行为是使用与您的方法相同的名称来呈现视图。那将是create.BUILDER.FORMAT

    尝试删除该行。请改用此代码:

    @post = current_user.posts.new(params[:post])
    respond_to do |format|
      if @post.save
        ...
    

    或者用

    写一个else case
    render :action => "new"
    

    【讨论】:

      【解决方案2】:

      啊,明白了。这是因为它从来都不是有效的,所以它会在“创建”时循环回到自身,在那里找不到模板并出错。设置 def create 的正确方法是这样的

      def create
        @post = Post.new(params[:post])
        if @post.valid? && current_user.posts << @post
          respond_to do |format|
            if @post.save 
              format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
              format.xml  { render :xml => @post, :status => :created, :location => @post }
            else
              format.html { redirect_to new_user_post_path(:current) }
              format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
            end
          end
        else
          render :action => 'new'
        end
      end
      

      【讨论】:

        【解决方案3】:

        不,他们没有不同的观点。那么你有app/views/posts/create.html.erb 文件吗?

        【讨论】:

        • 不..我有一个 _form/edit/index/new/show ..它的形式是 .. = form_for @post do |f| -如果@post.errors.any? #errorExplanation %h2= "#{pluralize(@post.errors.count, "error")} 禁止保存此帖子:" %ul - @post.errors.full_messages.each do |msg| %li= msg 还需要别的吗?
        • 有些奇怪,我认为这里正在发生。因为验证“确实”在 Rails 中开箱即用。我更新了我的模型在上面的样子。
        • 好的。请编辑您的问题,向我们展示控制器代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        相关资源
        最近更新 更多