【问题标题】:NoMethodError in ArticlesController#createArticlesController#create 中的 NoMethodError
【发布时间】:2015-02-26 21:38:00
【问题描述】:

所以我正在尝试按照这里的教程进行操作:http://guides.rubyonrails.org/getting_started.html

而且我对正在发生的事情有一些想法,但是在这一点上,我变得更加沮丧并且没有能力以有意义的方式看待这个问题。这是我目前的控制器。这很简单,我以为我知道发生了什么:

articles_controller.rb
class ArticlesController < ApplicationController
def new
end

def create
  @article = Article.new(article_params)

  @article.save
  redirect_to @article
end

private
  def article_params
    params.require(:article).permit(:title, :text)
  end
end

routes.rb

Rails.application.routes.draw do
  get 'welcome/index'
Rails.application.routes.draw do
    resource :articles
root 'welcome#index'
    end
end

但我现在已经超出了我的能力范围,无法继续进行。如果它有所作为,我正在运行 Windows 8 pro。任何帮助,将不胜感激。我可以说错误与“redirect_to”有关,但除此之外我什么都不知道! 我的错误现在看起来像:

NoMethodError in ArticlesController#create
undefined method `article_url' for #<ArticlesController:0x979bfc0>
Extracted source (around line #0):

app/controllers/articles_controller.rb:9:in `create'

堆栈跟踪如下所示:

actionpack (4.2.0) lib/action_dispatch/routing/polymorphic_routes.rb:268:in `handle_model_call'
actionpack (4.2.0) lib/action_dispatch/routing/url_for.rb:167:in `url_for'
actionpack (4.2.0) lib/action_controller/metal/redirecting.rb:95:in `_compute_redirect_to_location'
turbolinks (2.5.3) lib/turbolinks/xhr_headers.rb:21:in `_compute_redirect_to_location'
actionpack (4.2.0) lib/action_controller/metal/redirecting.rb:75:in `redirect_to'
actionpack (4.2.0) lib/action_controller/metal/flash.rb:57:in `redirect_to'
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:61:in `block in redirect_to'
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:60:in `redirect_to'
app/controllers/articles_controller.rb:9:in `create'
actionpack (4.2.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.2.0) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.0) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.0) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:92:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:92:in `_run_callbacks'
activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks'
activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.0) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.0) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.0) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.0) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.0) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.0) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.0) lib/action_controller/metal.rb:236:in `block in action'
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `call'
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve'
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `each'
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call'
rack (1.6.0) lib/rack/etag.rb:24:in `call'
rack (1.6.0) lib/rack/conditionalget.rb:38:in `call'
rack (1.6.0) lib/rack/head.rb:13:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.0) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.0) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.0) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
activerecord (4.2.0) lib/active_record/migration.rb:378:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `_run_callbacks'
activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
web-console (2.0.0) lib/action_dispatch/debug_exceptions.rb:18:in `middleware_call'
web-console (2.0.0) lib/action_dispatch/debug_exceptions.rb:13:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.0) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.0) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.0) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.0) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.0) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.0) lib/rack/lock.rb:17:in `call'
actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in `call'

【问题讨论】:

  • 请将您的路线添加到问题中

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

基本上,“未定义的方法`article_url' for”意味着rails无法为@article记录找到合适的路线。在定义路由时,rails 会生成两个以 _url 和 _path 结尾的方法。您可以在应用程序中使用它们来访问相应的 url,而无需对其进行硬编码。查看您的 routes.rb 文件中的代码,我发现了三件事:

  1. 您只需调用 Rails.application.routes.draw 一次
  2. 为模型生成 CRUD 路由的关键词是“resources”(复数),而不是“resource”(单数)
  3. (与错误无关)您的“get 'welcome/index'”看起来还没有完成。也许你的意思是“get '/index', to: 'welcome#index'”。第一个字符串指定url路径,to指定controller#action。

尝试使用以下 routes.rb:

Rails.application.routes.draw do
  resources :articles
  root 'welcome#index'
end

我建议您在使用routing guide 时也可以查看它。祝你好运!

【讨论】:

  • 路由指南非常有帮助,这是我第一次接触任何类型的网络应用软件,所以此时错误对我来说不是很详细。 “资源”是当前的问题,但很高兴知道 1 和 3。
  • 很高兴这对您有所帮助! Rails 是一个非常好的框架,而 Ruby 是一门非常有趣和有趣的语言。我希望您在使用它们时玩得开心! :)
  • 第 2 项 +1。这是一件容易被忽视的事情,但我的问题是我写了resource而不是复数resources。我的提示应该是当指南说show 的路线是article GET /articles/:id(.:format) articles#show,包括:id。当我再次查看bin/rake routes 时,我的显示路线没有指定:id 参数。
  • @ctlockey 三年后我可能会犯同样的错误哈哈哈。
【解决方案2】:

啊,你看,问题是你使用了单数 resource 词,而不是 resources(注意 s),在你的情况下你应该使用 resources,因为你有多篇文章

更多关于resourcesresource

【讨论】:

  • 'resources' 绝对是当前的问题,我现在回到本教程的正轨!我确信到目前为止我还有很多其他问题,但至少现在我至少可以继续学习教程,谢谢!
  • 很高兴您解决了问题,如果没有其他问题,请将我的回答标记为已接受。
  • 没错,我也犯了同样的错误。这是正确的答案。
【解决方案3】:

您在创建article 后重定向到@article 显示页面,但您没有在ArticlesController 中定义此方法。您必须定义该方法并为其创建视图。另外,你的路线是什么?

【讨论】:

  • 其实问题可能是路由没有定义,或者他排除了show route
  • 您能告诉我您是如何为该操作定义路线的吗?还有 - 你有文章的显示视图吗?
  • 在这一点上,我认为我应该得到一个关于“显示”的错误,但我无法做到这一点
【解决方案4】:

这是一个实现资源工作的硬代码 您可以将 json 对象传递给 redirect_to

class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
  end
  def new
  end
  def create
    @article = Article.new(article_params)
    @article.save
    redirect_to articles_path({:id => @article.id})
   end

  private
    def article_params
      params.require(:article).permit(:title, :text)
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2015-07-20
    相关资源
    最近更新 更多