2013-06-17 3 views
0

Я учусь, чтобы сделать формы из разных контроллеров, но при попытке сохранить данные, он говорит, что я получаюрубин на рельсах: не определен stringify_keys

NoMethodError in ProfilesController#create 
undefined method `stringify_keys' for "2":String 

Моих маршрутов файла:

resources :users do 
    member do 
    get 'profile' 
    end 
end 

Профиль модель

belongs_to :user 

модель пользователя

has_one :profile 

просмотров/профили/_form.html.erb

<%= form_for [@user, @profile] do |f| %> 
    .. 
<% end %> 

просмотров/пользователей/_form.html.erb

<%= render :partial => "profiles/form" %> 

Кроме того, говоря, когда я пытался сохранить данные, я перенаправляюсь на http://localhost:3000/users/2/profiles, где возникает ошибка, вместо http://localhost:3000/users/2/profile Обратите внимание на s в профиль, это меняется на меня?

Спасибо!

+0

Это, указывающие на маршрут вложенных ресурсов для профилей, но не показывая в маршрутах. Вы отправили все содержимое своих маршрутов.rb? – zeantsoi

+0

Вы нашли решение на этом? – zeantsoi

+0

В моем опыте каждый раз, когда я получаю ошибку строковых ключей, это связано с хешем. Я перехожу к методу, который строится ненадлежащим образом. –

ответ

1

Я бы взял несколько иной подход. Вместо добавления маршрута элемента GET для profile в маршрут ресурсов пользователей, я бы вложил маршрут ресурса для профиля в пределах ваших пользователей.

# config/routes.rb 
resources :users do 
    resource :profiles // notice the singular resource 
end 

Это обеспечит маршруты, необходимые для маршрутизации RESTfully к ресурсу вложенных профилей.

Тогда вы можете создать форму именно так, как вы указали:

# app/views/profiles/_form.html.erb 
<%= form_for [@user, @profile] do |f| %> 
    ... 
<% end %> 

В вашем ProfilesController, вы можете получить доступ к пользователю следующим образом:

# app/controllers/profiles_controller.rb 
user = User.find(params[:user_id]) 
profile = user.profile 

Я не уверен будет ли это определенно разрешить сообщение об ошибке, которое вы получаете, но это очень хорошо может.

EDIT:

Что касается комментария ниже упоминая undefined method 'model_name' for NilClass:Class в форме: Вы получаете эту ошибку, потому что переменные не передаются на ваш парциальный объем.При оказании частичного, вам необходимо пройти в любом локальном переменных вы хотите парциальное иметь доступ к:

# app/views/users/_form.html.erb 
<%= render :partial => "profiles/form", :locals => {:user => @user, :profile => @profile} %> 

быть осведомленным, однако, что переменные вы передаете к частичному будут доступны только в качестве местных переменных, а не экземпляры из них:

# app/views/profiles/_form.html.erb 
<%= form_for [user, profile] do |f| %> 
    ... 
<% end %> 
+0

, в каком действии я поместил этот код: 'user = User.find (params [: user_id])'? – hellomello

+0

Не имеет значения. Предположительно, вы находитесь либо в своих «новых», либо в «обновлениях», но в любом сценарии вы сможете получить доступ к 'user_id' через' params [: user_id] '. – zeantsoi

+0

Я получаю неопределенные «профили» метода в своем действии индекса. У меня есть это в нем '@user = User.find (params [: user_id])' и '@profiles = @ user.profiles' – hellomello

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