创建模型的新实例时,Rails中的NoMethodError

时间:2015-07-21 20:11:06

标签: ruby-on-rails ruby

我有一个依赖于其他模型的模型,我在routes.rb文件中指定了这个模型

Rails.application.routes.draw do
  resources :events do
    resources :guests
    get :whereabouts
  end
  devise_for :users, :controllers => { registrations: 'registrations' }

models/event.rb

class Event < ActiveRecord::Base
  belongs_to :user
  has_many :guests
end

models/guest.rb

class Guest < ActiveRecord::Base
  belongs_to :event
end

当我访问http://localhost:3000/events/2/guests/时,它可以正常运行,但是当我访问http://localhost:3000/events/2/guests/new时,我得到了

undefined method `guests_path' for #<#<Class:0x00000004074f78>:0x0000000aaf67c0>

views/guests/_form.html.erb文件的第1行

  <%= form_for(@guest) do |f| %>
  <% if @guest.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@guest.errors.count, "error") %> prohibited this event from being saved:</h2>
      <ul>
      <% @guest.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.text_field :first_name %>
  </div>
  <div class="field">
    <%= f.text_field :last_name %>
  </div>
  <div class="field">
    <%= f.text_field :email %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我已将路径更改为正确的路径,因为现在guests_path应该是event_guests_path,但我不知道在哪里更改它以使其正常工作。

有任何线索吗?我的路由错了吗?

2 个答案:

答案 0 :(得分:1)

您的路由是正确的。但是guest对象取决于事件对象,因此您必须将表单更改为:

<%= form_for [@event, @guest] do |f| %>
 ...
<% end %>

您必须在控制器中初始化@event变量,您可能会执行以下操作:

@event = Event.find(params[:event_id])
@guest = @event.guests.build

答案 1 :(得分:0)

来自the docs

  

对于命名空间路由,例如admin_post_url

<%= form_for([:admin, @post]) do |f| %>
  ...
<% end %>

所以,在你的情况下,你可能想要这个:

<%= form_for([:event, @guest]) do |f| %>