0

ユーザーがトピックを作成し、他のユーザーがその後投稿できるアプリケーションを作成したいと考えています。私は自分のリソースを自分の 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 %>
4

1 に答える 1

1

あなたのために物事を解決する必要があるいくつかのことがあります。

何よりもまず、投稿コントローラーでの作成アクションが少し間違っています。次のようになります。

  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ネストされたルートとネストされていないルートの両方へのルートがあります。投稿が常にトピック内にネストされていると想定されている場合(コントローラーロジックが示している)、ネストされていない投稿リソースにこれを追加する必要があります。

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

次に、そのform_forタグを次のように変更します。

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

これは、ネストされたリソースを使用しており、httpリクエストに正しいURLを使用することをフォームビルダーに通知します。

また、を使用してすべてのトピックを読み込んでいるようですTopic.find(params[:id])。これは機能しません-あなたは投稿コントローラーにいます、これは投稿IDです。次のようなidparamを使用して投稿をロードする必要があります。Post.find(params[:id])次に、次のようなトピックをロードします。topic = post.topic

于 2012-06-26T21:37:31.327 に答える