Ruby on rails 嵌套路由和表单_for and NoMethodError
正如下面所述的错误消息,我不使用复数形式的“user\u profiles\u path”,因为我在嵌套资源中定义了“resource:profile”Ruby on rails 嵌套路由和表单_for and NoMethodError,ruby-on-rails,ruby-on-rails-3,controller,form-for,nested-resources,Ruby On Rails,Ruby On Rails 3,Controller,Form For,Nested Resources,正如下面所述的错误消息,我不使用复数形式的“user\u profiles\u path”,因为我在嵌套资源中定义了“resource:profile” NoMethodError in Profiles#new 显示/home/smileymike/rails#u projects/bffmapp#u v2/app/views/profiles/new.html.erb,其中第20行出现: undefined method `user_profiles_path' for #<#<
NoMethodError in Profiles#new
显示/home/smileymike/rails#u projects/bffmapp#u v2/app/views/profiles/new.html.erb,其中第20行出现:
undefined method `user_profiles_path' for #<#<Class:0x90266ac>:0xa041294>
视图:profiles/new.html.erb
<div class="row">
<div class="span6 offset3">
<%= form_for([@user, @profile]) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :surname %>
<%= f.text_field :surname %>
<%= f.submit "Create my profile", class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>
控制器:
class ProfilesController < ApplicationController
def show
end
def new
@user = current_user
@profile = current_user.build_profile()
end
def edit
end
def create
end
def update
end
def destroy
end
end
使用这种多态路由的表单将始终使用多重路径来创建新记录。您需要在表单中明确说明:
form_for([@user, @profile], :url => user_profile_path(@user))
好消息是,
create
路线与update
路线相同。您是否尝试过([@profile,@user])的form_?是的,我也尝试过。奇怪的是,如上图所示,我继续加载网页而不改变细节。问题消失了。我以前见过这种情况,有时我不得不在routes.rb被修改时重新启动应用程序,即使是在开发模式下。它工作得非常好。但是,它在没有外括号(括号)的情况下工作。
user_profile POST /users/:user_id/profile(.:format) profiles#create
new_user_profile GET /users/:user_id/profile/new(.:format) profiles#new
edit_user_profile GET /users/:user_id/profile/edit(.:format) profiles#edit
GET /users/:user_id/profile(.:format) profiles#show
PUT /users/:user_id/profile(.:format) profiles#update
DELETE /users/:user_id/profile(.:format) profiles#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
root / static_pages#home
signup /signup(.:format) users#new
signin /signin(.:format) sessions#new
signout DELETE /signout(.:format) sessions#destroy
help /help(.:format) static_pages#help
about /about(.:format) static_pages#about
contact /contact(.:format) static_pages#contact
class ProfilesController < ApplicationController
def show
end
def new
@user = current_user
@profile = current_user.build_profile()
end
def edit
end
def create
end
def update
end
def destroy
end
end
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end
form_for([@user, @profile], :url => user_profile_path(@user))