2012-05-07 3 views
2

Я пытаюсь получить основную форму, чтобы работать, и я изо всех сил, потому что я получаю ошибкуне определен метод ..._ index_path Ruby On Rails

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

do 'rake routes', чтобы проверить правильный путь к методу' index' – Bongs

+0

Как выглядит ваш файл 'routes.rb'? – Soup

+0

Эй, я добавил свой файл соответствующих маршрутов, чтобы вы могли видеть, что у меня есть. Вид также называется new.html.erb, потому что он предназначен для создания новых профилей. Спасибо –

ответ

4

Проблема действительно так, как вы множественное название модели. Не делай этого. Он должен быть Profile, а не Profiles. Там у меня будет какая-то работа, чтобы вы могли использовать множественное имя модели, но ответ заключается в том, чтобы придерживаться соглашения Rails, а не бороться с каркасом. Переименуйте свою модель в Profile, а помощники url_for поймут, как правильно превратить новый объект Profile в URL-адрес /profiles.

+0

Удивительно это, похоже, сработало! Спасибо за помощь. , контроллеры = множественное число - это всегда правильные правила? –

+1

Да. Ваши модели всегда должны быть единственными, а контроллеры всегда должны быть множественными. – meagar

1

При запуске «реки маршрутов» команды, сделать «profiles_index» появляется в маршрутах? Обычно для страницы индекса модели, работа «индекс» остается так, маршрут profiles_path

Вы ошибка, вероятно, происходит из представления, где вы использовали profiles_index_path вместо profiles_path

+0

Спасибо за ваш ответ. Файл вида называется new.html.erb, потому что он предназначен для создания новых профилей - было бы замечательно узнать, что мне нужно изменить, чтобы исправить это. Еще раз спасибо :) –

+0

Вы не используете 'profiles_index_path' в new.html.erb .. или вы не разместили весь код. Я не думаю, что проблема в этой точке зрения. – gabitzish

+0

Странно, не так ли? Это все код и ни в коем случае не ссылаюсь на profile_index_path - но ошибка указывает на то, что я делаю в первой строке form_for? URL-адрес, который я пытаюсь загрузить, - localhost: 3000/newprofile –

0

Вы пробовали замените тэг form_for следующим:

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

Похоже, что он пытается рассматривать его как запрос GET на «/ profile». И, поскольку он не находит действие индекса, он дергается. Я думаю, что заставить его сделать POST, исправит эту проблему.

+0

эй, извините, забыл включить это. Файл вида называется new.html.erb - любая дополнительная помощь, которую вы можете предложить, будет высоко оценена. :) –

+0

Я отредактировал свой ответ. Надеюсь, это сработает! –

+0

Эй, Йосеп, спасибо за вашу помощь. К сожалению, я все еще получаю ту же ошибку :(действительно не знаю, почему это запутывается! –

1

Я думаю, что это не удается из-за того, что соглашение не сопровождается вашим именем модели.

Таким образом, я думаю, что проблема в основном связана с тем, что вы не соблюдаете соглашение о имени модели, которое классически было бы сингулярным, поскольку каждый экземпляр представляет один профиль. Я думаю, что form_for помощник пытается выяснить, что с ним делать и не удалось в результате. Таким образом, у вас есть два варианта, которые можно попробовать и решить. Рефакторируйте название модели единственной (я не знаю, насколько это сложно) или передайте: url paramater для form_for, чтобы он знал, куда отправлять.

<% form_for @profile, :url => path_to_create_action do |f| %> 

больше информации здесь:

+0

Привет DVG, это когда я перехожу к ../newprofile (который должен быть профилем # новым в соответствии с моими маршрутами). –

+0

Что происходит, если вы перемещаете 'resources: profiles,: controller => 'profiles'' над другими маршрутами? – DVG

+0

все еще такая же ошибка, даже если я перемещаю ресурсы в начало файла маршрутов. Мое имя модели множественное, @profile является уникальным, хотя, как и звонок в form_for. cheers –

0

Я работаю с 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 
    

Теперь вы должны иметь все в том, как вы ожидали. Поскольку вы перезаписал множественного числа и Singularizations(перегибы) в Ruby On Rails.

Надеюсь, это может быть полезно.

Смежные вопросы