我有一个依赖于其他模型的模型,我在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
,但我不知道在哪里更改它以使其正常工作。
有任何线索吗?我的路由错了吗?
答案 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| %>