未定义的方法`_s_path'错误

时间:2016-01-11 08:34:44

标签: ruby-on-rails methods undefined

尝试在我的应用中创建新的“广告”时出现undefined method错误。

表格:

<div class="row">
<%= form_for @advertisement do |f| %>
<div class="form-group">
  <%= f.label :title %>
  <%= f.text_field :title, class: 'form-control', placeholder: "Enter Title " %>
</div>

路线(控制器和型号名称都是单数):

resources :advertisement

rake routes:

    advertisement_index GET    /advertisement(.:format)          advertisement#index
                    POST   /advertisement(.:format)          advertisement#create
  new_advertisement GET    /advertisement/new(.:format)      advertisement#new
 edit_advertisement GET    /advertisement/:id/edit(.:format) advertisement#edit
      advertisement GET    /advertisement/:id(.:format)      advertisement#show
                    PATCH  /advertisement/:id(.:format)      advertisement#update
                    PUT    /advertisement/:id(.:format)      advertisement#update
                    DELETE /advertisement/:id(.:format)      advertisement#destroy

我收到错误:

undefined method `advertisements_path'

请帮帮我,我已经尝试了一些事情似乎没有任何效果。 提前谢谢!

4 个答案:

答案 0 :(得分:1)

控制器名称应为AdvertisementsController

中的复数... advertisements_controller.rb

路线应为复数...... resources :advertisements

模型应该是Advertisement

中的单数... advertisement.rb

答案 1 :(得分:0)

好的,如果你想保持单数格式,可以用以下方法设置表格的路径:

<%= form_for @advertisement, url: advertisement_path do |f| %>

Rails中的偏好是让你的控制器复数,所以资源:广告和广告控制器。

正如您已经创建的那样,您可以将资源更改为:

resources :advertisements, :controller => 'advertisement'

这给出了:

advertisements GET    /advertisements(.:format)  advertisement#index
               POST   /advertisements(.:format)    advertisement#create
new_advertisement  GET    /advertisements/new(.:format) advertisement#new

所以你现在将指向广告控制器

答案 2 :(得分:0)

拥有一个单一的控制器名称没有错,虽然它通常反对convention

#config/routes.rb
resources :advertisements, path: "advertisement" #-> url.com/advertisement/new

#config/routes.rb
resources :advertisement, controller: :advertisements #-> url.com/advertisement/new

#config/routes.rb
resource :advertisement #-> url.com/advertisement/new

参考文献:

惯例是将resources保持为复数,因为它表示HTTP "resources" directive; IE,您advertisements是多个资源,可以通过发送某些请求来调用。

你遇到的问题是Rails推断出来自对象的路径,所以你会有类似......

<%= form_for @advertisement 

... Rails将获取模型名称并创建advertisements_path的标准路线。

-

使用上述路线应解决问题(除了最上面的路线)。同时明确设置url的{​​{1}}也可以:

form

答案 3 :(得分:-1)

尝试

<div class="row">
<%= form_for @advertisement, url: advertisement_index_path do |f| %>
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: 'form-control', placeholder: "Enter Title" %>
</div>