undefined方法..._ index_path Ruby on Rails

时间:2012-05-07 18:10:17

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在尝试使用基本表单并且正在努力,因为我不断收到错误

 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'

5 个答案:

答案 0 :(得分:4)

问题确实是你的模型名称多元化的方式。不要那样做。它应该是Profile,而不是Profiles。我有一些工作可以让你使用复数模型名称,但答案是坚持Rails惯例而不是与框架作斗争。将您的模型重命名为Profileurl_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时有不同的路线。

我采取的措施是:

  1. 删除我刚刚创建的模型。

    rails d scaffold Media
    
  2. 使用以下代码修改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
    
  3. 现在再次执行脚手架:

    rails g scaffold Media
    
  4. 现在你必须按照预期的方式拥有一切。因为您已覆盖 Pluralizations Singularizations (Inflections) < / strong>在Ruby on Rails中。

    我希望它有用。

答案 4 :(得分:0)

您是否尝试使用以下内容替换form_for标记?

<%= form_for @profile, :as => :post do |f| %>

看起来它正试图将其视为对“/ profile”的GET请求。并且,由于它没有找到索引动作,它就会崩溃。我认为强制它进行POST将解决这个问题。