2011-06-28 19 views
1

で、私は最近、私のコメントのコントローラで3問題レール3

をレールにアップグレードしたアプリを持っている私は

def create 
    @cuser = @current_user 
    @story = Story.find(params[:story_id]) 
    @story.comments.create(:user_id => @cuser.login,:body => params[:comment][:body]) 
    respond_to do |format| 
    format.html { story_path} 
    format.js 
    end 
end 

を持っていますstory.rbでは私は私が

取得コメントを作成しようとすると、私は belongs_to :story

を持ってcomment.rbhas_many :comments を持っています

Couldn't find Story without an ID 

これはうまく機能しませんでした。なぜそれ以上のアイデアはありませんか?他に何が影響を与えているのでしょうか?それはルーティングの問題かもしれませんか?

答えて

0

はい、ルーティングの問題になる可能性があります。おそらくルーティングDSLが変更されたことがわかりました。あなたはそれを使いこなしていると思います。話

、あなたは(たぶん)

resources :stories do 
     resources :comments do 
     collection do 
      post :create 
     end 
     end 
    end 

ようなもので、私は唯一の推測が、私だと置き換えられている:あなたは

`map.resourcesのようなルートに何かを持っていたように見えますあなたは自動的にルートを作成生成、またはあなたはそれをもっとPRを指定したい場合でしょう

resources :stories do 
    resources :comments 
end 

のようなルートを必要とする - これはあなたが見ているエラーの種類を与えるだろうと思いますecisely

resources :stories do 
    resources :comments do 
    member do 
     post :create 
    end 
    end 
end 
+0

私はリソースを持っています:[:story_id]今それは私がのparamsを使用しています – gleb

0

私はあなたが以下のルートの設定を持っていると仮定します。

resources :stories do 
    resources :comments 
end 

そのような場合は、params[:story_id]を使用する必要があります。

@story = Story.find(params[:story_id]) 
+0

使用しています:物語は リソースん[:story_id]を今すぐ。それは何の違いもありません – gleb

1

あなたのフォーム定義は次のようになります。

<%= form_for [@story, Comment.new] do |form| %> 
    <div id="body"> 
    <%= form.text_field :body %> 
    </div> <% form.hidden_field :user_id, :value => @current_user.login %> 
    <p> 
    <%= submit_tag 'Comment' %> 
    </p> 
<% end %> 

フォームはPOST /comments代わりのPOST /stories/:story_id/commentsアクションを使用しています。 ルートが見つからないことについて例外がスローされているはずです。そのため、私の解決策についてはわかりませんでした。しかし、あなたのルートは何らかの理由でcommentsのリソースを持っています。 URLを作成する方法はわかっていますが、/stories/:story_id部分を含める必要はありません。

もう1つのことは、フォームにcurrent_userを渡すことです。 Firebugやその他のWebマスターツールの使い方を知っている人なら誰でもこのフィールドをたとえばあなたのログインに変更して、あなたのようにコメントを投稿することができます。コントローラの作成アクションでユーザフィールドを割り当てる必要があります。

もう1つ。私は本当にあなたがなぜこのルートをすべて必要とするのか理解できません。それは私のアプリだった場合、ルートはこのようなものになります。

Telling_tales::Application.routes.draw do 

    resource :session 
    resource :stories #really can't see why you need a singular route here 
    resource :user 
    resources :users do 
    get 'register' => 'create', :on => :collection #maps to 'users#create' 
    end 

    resources :stories do 
    resources :comments 
    collection do 
     get ':login' => 'show' #it seems illogical to place this route under `stories` namespace 
          #if you wanted to display stories of one particular user, you'd better make it `/users/:user_id/stories` 
     get 'search' 
    end 
    root :to => 'stories#index' 
end 

thisthisガイドを見てみましょう。

+0

を助けていない私はのparamsをコメント エンド – gleb

+0

@gleb - これはどこから来たのか分かりますか?私はバスケットが何かにあると思う。たぶん、story_idは決してフォームに渡されません。 – natedavisolds

+0

これはフォームです <%= form_for Comment.new do | form | %>

<%= form.text_field :body %>
<%form.hidden_​​field:user_idは、:値=> @%>

<%= submit_tag 'コメント' %>

<% end %> – gleb