嵌套资源创建无法找到没有ID的主题

时间:2012-06-26 21:26:05

标签: ruby-on-rails-3 routes

我想创建一个用户可以创建主题的应用程序,其他人可以在此之后发布帖子。我将我的资源嵌套在routes.rb中:

MyPedia2::Application.routes.draw do
    resources :users

    resources :sessions, only: [:new, :create, :destroy]
    resources :topics, only: [:show, :create, :destroy] 
    resources :posts
    resources :topics do

    resources :posts, only: [:create, :show, :new]

    end

在我的主题展示页面中,我想展示topic.title和发帖帖子以及post.form.html.erb。 当我创建一个帖子时,一切正常,我会犯错误

ActiveRecord::RecordNotFound in PostsController#create

Couldn't find Topic without an ID..

这是我的posts_controller.rb:

class PostsController < ApplicationController
    before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user, only: :destroy

    def new
        @topic= Topic.find_by_id(params[:id])
        @post = @topic.posts.build(params[:post])
    end



    def show
    @topic = Topic.find(params[:id])
    @posts = @topic.posts.paginate(page: params[:page])
  end 

    def create
        @topic = Topic.find(params[:id])
        @post = @topic.posts.build(params[:post])
        @post.topic  = @topic

        if @post.save
            flash[:success] = "Konu oluşturuldu!"
            redirect_to :back
        else
            render 'static_pages/home'
        end
    end

  def destroy
    @post.destroy
    redirect_to root_path
  end
  private

    def correct_user
      @post = current_user.posts.find_by_id(params[:id])
      redirect_to root_path if @post.nil?
    end
end

和_post_form.html.erb:

<%= form_for @new_post do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
        <%= f.text_area :content, placeholder: "yorumunuzu girin..." %>
  </div>
  <%= f.submit "Gönder", class: "btn btn-large btn-primary" %>
<% end %>

1 个答案:

答案 0 :(得分:1)

有一些事情可以为你解决问题。

首先,你在posts控制器中的创建操作有点不对 - 它看起来应该是这样的:

  def create
    @topic = Topic.find(params[:topic_id])
    @post = @topic.posts.build(params[:post])

    # This is unnecessary as you're already adding
    # the post to the topic with the build statement.
    # @post.topic  = @topic

    if @post.save
        flash[:success] = "Konu oluşturuldu!"
        redirect_to :back
    else
        render 'static_pages/home'
    end
  end

此控制器操作假定您将对嵌套在主题中的帖子资源使用put请求,因此您必须清理路由。

您有posts#create嵌套和未嵌套的路由。 如果帖子总是应该嵌套在你的控制器逻辑所说的主题中,那么你应该将它添加到unnested posts资源中:

resources :posts, except: [:new, :create]

然后将form_for标记更改为:

<%= form_for [@topic, @post] do |f| %>

这告诉表单构建器您正在使用嵌套资源,并将为http请求使用正确的URL。

此外 - 您似乎正在使用Topic.find(params[:id])加载所有主题。这不会起作用 - 你在帖子控制器中,这是一个帖子ID。你应该加载id为param的帖子,如下所示:Post.find(params[:id])然后是这样的主题:topic = post.topic