Ruby NoMethodError – BlahController的未定义方法`blah_url’

我从一个链接调用这个js:

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 "/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 #: (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? 为什么要寻找它? 我是否需要在模型中包含一些内容。 它只是为vars提供attr_accessors。

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

Heres是我的路线文件:

 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 

谢谢您的帮助。

当你说redirect_to @entry时,entry_url会要求你重定向到

路由文件中没有条目资源。 你确实有一个嵌套在用户中,但是你需要传递和输入。

 redirect_to [ @user, @entry ] 

刚刚看到你的评论 – 如果它在JSON路径上这样做,你需要具备

 location: [@user, @entry] 

基本上,无论您要求rails为条目构建URL,您都需要传递条目的用户,因为您在路由中嵌套了用户,而不是作为独立的资源路由。

添加编辑以响应评论,因为评论中没有格式:

是的,这将删除该位置,因为它将不再调用帮助程序在json中构建该位置,但我假设你想要它。 所以尝试这个使位置工作:

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

从你的评论…如果这不起作用,那么让我们尝试直接调用url助手

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

如果你使用Rails3,这可能是因为使用rails3,url已成为路径

例如:

 #rails2 entry_url #rails3 entry_path 

所以尝试使用entry_path而不是entry_url