我正在尝试使用基本表单并且正在努力,因为我不断收到错误
undefined method `profiles_index_path' for #<#<Class:0x4fe1ba8>:0x4fccda0>
我已经检查过,似乎无法解决我出错的地方。
在我看来(new.html.erb)我有:
<%= form_for @profile do |f| %>
<%= f.text_field :name %>
<%= f.text_field :city %>
<%= f.text_field :country %>
<%= f.text_field :about %>
<%= f.submit "Create Profile" %>
<% end %>
在我的个人资料控制器中,我有:
class ProfilesController < ApplicationController
def new
@title = "New Profile"
@profile = Profiles.new
end
def create
@user = current_user
@profile = @user.profiles.new(params[:profile])
if @profile.save
redirect_to profile_path, :notice => "Welcome to your new profile!"
else
render "profiles#new"
end
end
def edit
@user = current_user
@profile = @user.profiles.find(params[:id])
end
def update
@title = "Update Profile"
@user = current_user
@profile = @user.profiles.find(params[:id])
if @profile.update_attributes(params[:profile])
redirect_to profile_path
else
render action: "edit"
end
end
def index
@user = current_user
@profile = @user.profiles.all
@title = "Profile"
end
end
最后在我的个人资料模型中
class Profiles < ActiveRecord::Base
belongs_to :user
end
人们可以提供的任何帮助都会非常感激,因为我很难过。 :)
抱歉忘了包含路线:
controller :profiles do
get "newprofile" => "profiles#new"
get "updateprofile" => "profiles#update"
get "profile" => "profiles#home"
end
resources :profiles, :controller => 'profiles'
答案 0 :(得分:4)
问题确实是你的模型名称多元化的方式。不要那样做。它应该是Profile
,而不是Profiles
。我有一些工作可以让你使用复数模型名称,但答案是坚持Rails惯例而不是与框架作斗争。将您的模型重命名为Profile
,url_for
帮助程序将了解如何将新的个人资料对象正确转换为/profiles
网址。
答案 1 :(得分:1)
如果你运行“rake routes”命令,你的路线中会出现“profiles_index”吗?通常对于模型的索引页面,工作“索引”被省略,因此路由为profiles_path
您的错误可能来自您使用profiles_index_path
代替profiles_path
答案 2 :(得分:1)
我认为由于公约未遵循您的型号名称而导致其失败。
所以我认为你的问题主要在于你没有遵循模型名称的约定,这通常是单数的,因为每个实例代表一个配置文件。我认为form_for帮助器试图弄清楚如何处理它并因此失败。所以你有两个选择来尝试和解决。将模型名称重构为单数(我不清楚这是多么困难)或将:url参数传递给form_for,以便它知道要发布到哪里。
<% form_for @profile, :url => path_to_create_action do |f| %>
此处提供更多信息:
答案 3 :(得分:1)
我正在使用 Rails 5 ,我得到了相同的错误,并且使用单词Media
作为我的模型并且RoR使用Medium
作为复数,所以我在执行rake routes
时有不同的路线。
我采取的措施是:
删除我刚刚创建的模型。
rails d scaffold Media
使用以下代码修改config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
# Here you can put the singular and plural form you expect
inflect.irregular 'media', 'medias'
end
现在再次执行脚手架:
rails g scaffold Media
现在你必须按照预期的方式拥有一切。因为您已覆盖 Pluralizations 和 Singularizations (Inflections) < / strong>在Ruby on Rails中。
我希望它有用。
答案 4 :(得分:0)
您是否尝试使用以下内容替换form_for标记?
<%= form_for @profile, :as => :post do |f| %>
看起来它正试图将其视为对“/ profile”的GET请求。并且,由于它没有找到索引动作,它就会崩溃。我认为强制它进行POST将解决这个问题。