2016-06-19 14 views
1

Zugegebenermaßen fragte ich vor ein paar Tagen darüber, aber ich war nicht klar, also habe ich keine richtigen Antworten bekommen. Also habe ich diese Mini-Blog-Sache auf meiner Website und ich habe festgestellt, dass wenn ich ungültige Daten eingeben (dh Titel zu kurz) bekomme ich umgeleitet von von x.com/posts/new (oder/bearbeiten) zu indexieren (x.com/posts), trotz der Tatsache, dass der Post-Index nicht existiert (außer: Index hinzugefügt in Routen).Bug: Routing zum Index, wenn der Index nicht existiert

Beiträge Controller

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 

Routen

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 für Beiträge

= 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 

Es Vielleicht ist es erwähnenswert, dass der Index nicht existiert, weil ich Beiträge auf der Hauptseite zeige. Danke für Ihre Hilfe!

Antwort

0

Um Ihre Frage zu beantworten, würde ich sagen, dass Sie Ihre rake routes überprüfen sollten. Eines der Dinge, die Sie dort sehen würden, ist, dass Ihre Post#create Aktion zu /posts geht, was die Art und Weise ist, wie eine RESTful-Anwendung für neue Ressourcen definiert wird.

Bei der Arbeit mit RESTful-Anwendungen wird die Aktion, die beim Arbeiten an einer Ressource aufgerufen wird, weitgehend von der HTTPMethode bestimmt, die für die Ressource aufgerufen wird.

A create Aktion würde durch eine POST Anfrage an die \posts Route ausgelöst werden, während der index durch eine GET Anfrage an die \posts Route ausgelöst werden würde

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 

Jetzt würde sich wundern, warum Ihr macht es noch zeigen posts/new Formular auf der gleichen Seite, das ist, weil Sie die render 'new' Methode in Ihrer Post#create Aktion aufgerufen haben, die buchstäblich die new Sicht auf diese (erstellen) Aktion rendern Rendern.

Ich hoffe, Sie verstehen das jetzt besser.

+0

vielen Dank, das war sehr lehrreich! Ich weiß aber immer noch nicht recht, wie ich mit dem Problem umgehen soll. Ich nehme an, es geht um 'wenn @ post.save redirect_to @post sonst 'neu' rendern, oder? Wie repariere ich das? – Ivan

Verwandte Themen