2015-04-21 3 views
0

У меня есть две моделиRails 4 Разрабатывают перезвонить о регистрации

пользователя (идентификатор, имя, is_host, ....)

Host (идентификатор, имя, user_id, ...)

с Ассоциацией

hasOne Пользователь хост

Я использую Devise для регистрации пользователя. Когда пользователь хочет зарегистрироваться в качестве Хоста, я хочу установить is_host = 1 и create a row in Host с name Хоста, который он предоставляет в Регистрационной форме.

Что я хочу делать?

  1. Разрешить Регистрационную форму принимать Хост
  2. Создания данных ассоциации, когда пользователь выбирает register as host

Am пытаясь понять, где я могу написать логику, основанную на том, что пользователь выбирает для регистрации в качестве и затем создайте соответствующую строку в Host.

Пользователь От

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

    <div class="field"> 
    <%= f.label :first_name %><br /> 
    <%= f.text_field :first_name, autofocus: true %> 
    </div> 

    <div class="field"> 
    <%= f.label :last_name %><br /> 
    <%= f.text_field :last_name %> 
    </div> 

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

    <div class="field"> 
    <%= f.label :password %> 
    <% if @validatable %> 
    <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off" %> 
    </div> 

    <div class="field"> 
    <% f.label :password_confirmation %><br /> 
    <% f.password_field :password_confirmation, autocomplete: "off" %> 
    </div> 

    <div class="field"> 
    <%= f.label :is_host %><br /> 
    <%= radio_button("user", "is_host", true) %> Yes 
    <br/> 
    <%= radio_button("user", "is_host", false) %> No 
    </div> 

    <div class="actions"> 
    <%= f.submit "Signup" %> 
    </div> 
<% end %> 
+0

Было бы хорошо, если вы разместили форму кода – RSB

+0

@RSB обновил ее. –

+1

Я думаю, что это может помочь вам, переопределяя контроллеры: http://stackoverflow.com/questions/3546289/override-devise-registrations-controller или лучший ответ, данный @RSB – Deep

ответ

2

Простой способ добавить attr_accessor к пользовательской модели, например,

attr_accessor :host_name 

И использовать это в том виде, как

= f.text_field :host_name 

Вы можете добавить after_create обратного вызова в модели, чтобы сохранить хозяин, основанный на значении кнопки радио

after_create :create_user_host, if: Proc.new { |user| user.is_host } 

def create_user_host 
    self.create_host(name: host_name) 
end 

или

Вы можете использовать https://github.com/ryanb/nested_form драгоценный камень, чтобы сохранить связь напрямую. Просто добавьте

accepts_nested_attributes_for :host 

и в виде

= nested_form_for resource do |f| 
    # code for user 
    = f.fields_for :host do |host_f| 
    = host_f.text_field :name 

Более подробную информацию можно найти в nested_form гем документации.

Надеюсь, это поможет!

+0

спасибо Paji :) еще один вопрос. «Я.create_host (name: host_name) 'это создаст строку в таблице «hosts» –

+0

Да, она создаст хост, связанный с пользователем – RSB

+0

Но нам не нужно добавлять что-то вроде Host.create (name: host_name) –