2013-03-26 4 views
7

のための未定義のメソッド `blah_url」:ルビーNoMethodError - 私はこれはリンクからJS呼び出していますBlahController

function createNewTopLevelEntry(){ 
var user_id = $("#user").val(); 
var header = prompt("Enter the name"); 
$.ajax('/users/' + user_id + '/entries', { 
    data: { 
     entry: { header: header, 
       user: user_id } }, 
    type: 'POST', 
    cache: false, 
    dataType: 'json', 
    success: displayTopLevelEntries 
}); 

} 

それは、このコントローラーを打つ:

def create 
    @entry = Entry.new(params[:entry]) 
    respond_to do |format| 
    if @entry.save 
     format.html { redirect_to @entry, notice: 'Entry was successfully created.' } 
     format.json { render json: @entry, status: :created, location: @entry } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @entry.errors, status: :unprocessable_entity } 
    end 
    end 
end 

これは、サーバー上の応答です:

Started POST "https://stackoverflow.com/users/1/entries" for 127.0.0.1 at 2013-03-25 21:50:36 -0700 
Processing by EntriesController#create as JSON 
Parameters: {"entry"=>{"header"=>"Hi", "user"=>"1"}, "user_id"=>"1"} 
(0.1ms) begin transaction 
SQL (0.5ms) INSERT INTO "entries" ("completed", "created_at", "endtime", "header", "parent", "starttime", "starttimeset", "text", "totaltime", "updated_at", "user") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [["completed", nil], ["created_at", Tue, 26 Mar 2013 04:50:36 UTC +00:00], ["endtime", nil], ["header", "Hi"], ["parent", nil], ["starttime", nil], ["starttimeset", nil], ["text", nil], ["totaltime", nil], ["updated_at", Tue, 26 Mar 2013 04:50:36 UTC +00:00], ["user", "1"]] 
(2.5ms) commit transaction 
Completed 500 Internal Server Error in 10ms 

NoMethodError - undefined method `entry_url' for #<EntriesController:0x007fb22b9f7fd8>: 
(gem) actionpack-3.2.11/lib/action_dispatch/routing/polymorphic_routes.rb:129:in `polymorphic_url' 
(gem) actionpack-3.2.11/lib/action_dispatch/routing/url_for.rb:150:in `url_for' 
(gem) actionpack-3.2.11/lib/action_controller/metal/rendering.rb:60:in `_process_options' 
(gem) actionpack-3.2.11/lib/action_controller/metal/streaming.rb:208:in `_process_options' 
(gem) actionpack-3.2.11/lib/action_controller/metal/renderers.rb:34:in `block in _handle_render_options' 

entry_urlとは何ですか?なぜそれを探しているのですか?私はモデルに何かを含める必要がありますか?そのヴァルスのためのattr_accessorsがあります。助けのための

Tasks::Application.routes.draw do 
    match '/users/:id/projects' => 'users#show_projects_for_user' 
    authenticated :user do 
    root :to => 'home#index' 
    end 
    root :to => "home#index" 
    devise_for :users 
    resources :users do 
    resources :entries 
    end 
end 

ありがとう:

class Entry < ActiveRecord::Base 
    attr_accessible :completed, :endtime, :header, :starttime, :starttimeset, :totaltime, :user, :text, :parent 
end 

相続人は、私のルートファイルです。

+0

entry_urlは、redirect_to @entry –

+0

と言うときにリダイレクトするよう求めていますが、dataTypeがjsonである場合、formal.htmlは呼び出されませんか? –

+0

私はformat.html行を削除しましたが、同じエラーがありましたか? –

答えて

9

entry_urlは、あなたがあなたがルートファイルのエントリのリソースを持っていないredirect_to @entry

を言うときにリダイレクトするように求めているものです。あなたはユーザーの中にネストされたものを持っていますが、それからエントリーと同様に渡す必要があります。

redirect_to [ @user, @entry ] 

はちょうどあなたのコメントを見た - それはJSONパスでこれをやっている場合も同様に、あなたは基本的にどこでもあなたが合格する必要があるエントリのURLを構築するためにレールを求めている

location: [@user, @entry] 

を持っている必要がありますエントリ内のユーザーは、ルート内でユーザー内にネストされたエントリを持ち、スタンドアロンのリソースルーティングではないためです。

コメントにはフォーマットはありませんので、コメントに対応するための編集を追加する:はい、これはそれはそれはもはやJSONでその場所を構築するためにヘルパーを呼び出すと場所を削除しないように動作します

が、私はあなたがそれを望んでいると推測しています。だから、場所の仕事をするために、これを試してみてください。

format.json { render json => { :entry => @entry, :status => created, :location => [@user, @entry] }} 

あなたのコメントから...それはあなたがRails3、このかもしれないケースを使用している場合

直接
format.json { render json => { :entry => @entry, :status => created, :location => user_entry_url(@user, @entry) }} 
+0

意味があります。しかし、私はこれにコードを変更しました: –

+0

あなたはそのコメントに来ることをもっと意味すると思います - あなたは複数行のコメントを行うことはできません:-) ...しかし、上記の答えはあなたが尋ねた質問に答えるべきです。 –

+0

私はこれにコードを変更し、依然としてエラーをスローします。場所を削除する:作品。 –

0

をURLヘルパーを呼び出してみましょうその後、働いていない場合rails3で、URLがパスとなっているので、

例:

#rails2 
entry_url 

#rails3 
entry_path 

だからを試してみてくださいの代わりにentry_url

+0

いいえ、これは正しくありません。問題は、彼がパスヘルパーに必要な情報を渡していないためです。ルートを見てください。 –

+0

** _ url **は 'http:// www.example.com/foo'のようなフルURLを指し、** _ path **は'/foo'のような相対パスを指します。両方とも有用で有効です。 – user569825