2012-01-10 2 views
3

Здравствуйте, снова, сообщество stackoverflow!Вложенные регистрационные данные в Rails 3.1 с Devise

Я работаю над написанием простой системы блога в Rails, и я использую Devise для части аутентификации.

Я получил основную регистрацию по электронной почте/паролю, и теперь я настроил соединение «один к одному» таблицы пользователей (базовое, созданное при разработке) и таблицу UserData, содержащую такие вещи, как имя пользователя , разрешения, около, и так далее.

Это довольно просто - таблица пользователей на 100% придумала ваниль и has_one UserData. Userdata принадлежит пользователю.

Я попытался расширить форму регистрации, сгенерированную Devise, чтобы она позволяла пользователю вводить не только его адрес электронной почты и пароль, но также и его желаемое имя пользователя. Таким образом, когда форма будет отправлена, если имена полей формы будут правильными (правильная структура вложенных хэшей, таких как «электронная почта» для электронной почты пользователя, и «UserData [имя]» для желаемого пользователя имя), новый пользователь будет создан автоматически, и соответствующая соответствующая запись UserData должна также автоматически создаваться Rails, правильно?

Прямо сейчас, у меня огромный вопрос с [название] поле UserData не появляется на всех ... Вот файл У меня возникли проблемы с ...

new.html.erb

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
<%= devise_error_messages! %> 

    <div><%= f.label :email %><br /> 
<%= f.email_field :email %></div> 


#This is the tidbit that doesn't work 
<%= f.fields_for "UserData" do |ud_f| %> 
    <%= ud_f.label "username" %> 
    <%= ud_f.text_field :name %> 
<% end %> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

<div><%= f.label :password_confirmation %><br /> 
<%= f.password_field :password_confirmation %></div> 

<div><%= f.submit "Sign up" %></div> 
<% end %> 

<%= render :partial => "devise/shared/links" %> 

Я искал ответ на часы и часы, но безрезультатно. Если я намеренно пропущу слово «UserData» в поле fields_for, он распечатает это поле. Это странно, и я понятия не имею, что заставляет это поле исчезнуть ...

Я очень благодарен за помощь! Спасибо за ваше время! :)

редактировать 1 + 2:

После регистрации по умолчанию контроллера несколько бездельничал, я ПЕРЕОПРЕДЕЛЕН Разрабатывают и создал мой собственный. Я отредактировал маршрут разработки, чтобы вызвать свой пользовательский контроллер, как предложил timbrandes, но я не могу получить доступ к @user в моем контроллере. Вот код, который я до сих пор ...

class RegistrationsController < Devise::RegistrationsController 
    def new 
    resource = build_resource({}) 
    resource.UserData = UserData.new 
    respond_with resource 
    end 

    def create 
    logger.debug "\n\n\nIN CREATE\n\n\n\n" 
    logger.debug params.to_json 
    super 
    end 

    def update 
    super 
    end 
end 

ответ

3

Ну, прошло много времени, но в итоге я получил его, работая, сломав и переделав большую часть моего кода разработчика. Честно говоря, было не так много, чтобы переписать, и теперь это отлично работает.

Для любых будущих разработчиков, просматривающих этот (слегка запутывающий) вопрос и ответ, единственный совет, который я могу вам дать, - это обязательно написать структурированный код формы, особенно для вложенных ресурсов. Это мой текущий registrations_controller.rb, который работает:

class RegistrationsController < Devise::RegistrationsController 
    def new 
    resource = build_resource({}) 
    resource.build_user_data 
    respond_with resource 
    end 

    def create 
    resource = build_resource(params[:user]) 

    if(resource.save) 
     sign_in(resource_name, resource) 
     respond_with resource, :location => after_sign_up_path_for(resource) 
    else 
     render :action => "new" 
    end 


    end 

    def update 
    super 
    end 
end 

И в .erb для формы регистрации:

<div class="form-box"> 

    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
     <%= devise_error_messages! %> 

     <div><%= f.label :email %> 
     <%= f.email_field :email %></div> 

     <%= f.fields_for(:user_data) do |udf| %> 
      <%= udf.label :name, "Desired user name" %> 
      <%= udf.text_field :name %> 

      <%= udf.label :roles, "Privileges"%> 
      <% for role in UserData::ROLES %> 
       <%= check_box_tag "user[user_data_attributes][roles][]" , role, resource.user_data.roles.include?(role) %> 
       <%=h role.humanize %><br /> 
      <% end %> 
      <%= hidden_field_tag "user[user_data_attributes][roles][]" %> 

     <% end %> 

     <div><%= f.label :password %> 
     <%= f.password_field :password %></div> 

     <div><%= f.label :password_confirmation %> 
     <%= f.password_field :password_confirmation %></div> 

     <div><%= f.submit "Sign up" %></div> 
    <% end %> 

    <%= render :partial => "devise/shared/links" %> 

</div> 
1

Существует причина, ваши поля не отображаются, то есть, вы должны вызвать (например) @user.user_data.build где-то в вашем контроллере (RC#196 Nested Model Form Part 1), чтобы сделать экземпляр объекта user_data, который относится к полям fields_for.

Собственный способ, я могу придумать, чтобы пойти с пользовательским контроллером разработки (see list of Controllers), выбрать соответствующий метод для регистрации и добавить что-то вроде @user.user_data.build.

Другой способ - денормализовать вашу схему данных и поместить все в сам пользователь (на самом деле это не ответ на ваш вопрос, но в любом случае ;-)). Плюс: не возиться с обезьянными исправленными контроллерами.

Убедитесь, что вы определили accepts_nested_attributes_for: user_data в своей модели разработки.

+0

спасибо за ответ. Я пробовал ваши предложения, но, к сожалению, я не могу получить доступ к @user в контроллере регистрации devise. Я обновил первое сообщение, чтобы содержать более подробную информацию и код контроллера. –

+0

ОК, поэтому Devise занимается не с объектом @user или @admin, а с объектом, который они называют ресурсом. Таким образом, все не зависит от соответствующей модели и остается гибким. Попробуйте вызвать 'resource.user_data.build', но имейте в виду, что этот контроллер, вероятно, сломается, если у вас есть что-то другое, кроме вашего ресурса user. Обязательно прочтите этот код https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb - удачи :) –

+0

Хм, это странно ... Я обновил модель , но 'resource.UserData.build' все еще вызывал ошибку, поэтому я переключился на' resource.UserData = UserData.new', который запустил форму, но поле имени пользователя было названо 'name = 'user [UserData_attributes] [name ] "', который выглядит не так, не должен ли он быть "name =" пользователем [UserData] [name] "'? Отправка этой формы вызывает следующее предупреждение: «ПРЕДУПРЕЖДЕНИЕ: нельзя назначать защищенные атрибуты: UserData_attributes'. Странно, так как у меня нет этого конкретного поля, объявленного где угодно. (обновите модель в главном сообщении) –

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