错误:当索引不存在时路由到索引

时间:2016-06-19 21:17:30

标签: ruby-on-rails ruby

不可否认,几天前我问过这个问题,但我并不清楚,所以我没有得到任何正确的答案。 所以我在我的网站上有这个迷你博客的东西,我注意到如果我输入无效数据(即标题太短)我从x.com/posts获得重定向 / new(或/ edit)索引(x.com/posts),尽管后期索引不存在(除了:索引在路由中添加)。

发布控制器

class PostsController < ApplicationController
before_action :find_post, only: [:show, :edit, :update, :destroy]
before_action :admin_user, except: [:show]

  def show

  end

  def new
    @post = current_user.posts.build
    @categories = Category.all.where(belongs_to_posts: true)
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      redirect_to @post
    else
      render 'new'
    end
  end

  def edit
    @categories = Category.all.where(belongs_to_posts: true)
  end

  def update
    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
    end
  end

  def destroy
    @post.destroy
    redirect_to root_path
  end

  private

    def find_post
      @post = Post.find(params[:id])
    end

    def post_params
      params.require(:post).permit(:description, :title, :image, :categories_id)
    end

    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end
end

路由

Rails.application.routes.draw do
      root
      ...        
      get 'galleries/accept'              => 'galleries#accept'
      resources :galleries
      resources :photos
      resources :posts,                  except: [:index]
      resources :categories
      resources :documents
    end

_form for posts

= simple_form_for @post do |f|
  = f.input :image
  = f.input :title
  = f.input :categories_id, :collection => @categories, label_method: :name, value_method: :id
  = f.cktext_area :description, data: {no_turbolink: true}, :ckeditor => {:toolbar => 'mini'}
  = f.button :submit

值得注意的是索引不存在,因为我在主页上显示帖子。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

要回答你的问题,我会说你应该检查你的rake routes。您可以看到的一件事是Post#create操作转到/posts,这是为新资源定义RESTful应用程序路由的方式。

使用RESTful应用程序时,在处理资源时调用的操作很大程度上取决于在资源上调用的HTTPMethod。

create路由的POST请求会触发\posts操作,而index请求会向GET请求触发\posts Cheatsheet: create => POST to /posts index => GET to /posts update => PATCH to /posts/:id show => GET to /posts/:id destroy => DELETE to /posts/:id edit => GET to /posts/:id/edit new => GET to /posts/new 路线

posts/new

现在你想知道它为什么仍然在同一页面上显示你的render 'new'表单,这是因为你在Post#create操作中调用了new方法,这实际上是在说此(创建)操作的this.orbit.position.add(travel); this.camera.position.sub(travel.applyQuaternion(this.orbit.quaternion)); 视图。

我希望你现在能更好地理解这一点。