Регистрация с разработкой - PullRequest
0 голосов
/ 19 марта 2012

У меня есть модель Сообщества, которая has_many: users, и модель Users, которая принадлежит_to: community.

Мне нужно, когда пользователь регистрируется, может создать Сообщество в том же процессе и быть назначенным этому Сообществу при подписании.вверх.Если сообщество не создано, пользователь не должен быть создан.

Как мне это сделать?Возможно создание пользовательского контроллера устройства для пользователя ... Любая идея будет оценена.

Спасибо


После изменения первого ответа:

app / controllers / devise/registrations_controller.rb

 # GET /resource/sign_up
    def new
      logger.info "1"
      build_resource({})
      render_with_scope :new
    end

# POST /resource
def create
  logger.info "2"
  build_resource

  if Community.save_both_a_new_user_and_a_new_instance(resource)
    if resource.active_for_authentication?
      set_flash_message :notice, :signed_up if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with resource, :location => redirect_location(resource_name, resource)
    else
      set_flash_message :notice, :inactive_signed_up, :reason => resource.inactive_message.to_s if is_navigational_format?
      expire_session_data_after_sign_in!
      respond_with resource, :location => after_inactive_sign_up_path_for(resource)
    end
  else
    clean_up_passwords(resource)
    respond_with_navigational(resource) { render_with_scope :new }
  end
end

app / views / devise / registrations / new.html.erb

<h2>Sign up</h2>

<%= 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>

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

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>
</br>
<h4>Introduce la contraseña de tu comunidad</h4>
<div><%= f.number_field :community_id %></div>
<p>o Crea una nueva comunidad</p>

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

<%= render "links" %>

app / views / devise / registrations / edit.html.erb

<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

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

  <div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password, :autocomplete => "off" %></div>

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

  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %></div>

  <div><%= f.submit "Update" %></div>
<% end %>

<h3>Cancel my account</h3>

<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>

<%= link_to "Back", :back %>

GEMFILE:

source 'https://rubygems.org'
gem 'rails', '3.2.2'
gem 'sqlite3'
gem 'json'
gem 'execjs'
gem 'therubyracer'
gem 'devise'
gem "cancan"
gem 'paperclip'
gem "aws-s3"
gem 'pg'
gem 'twitter-bootstrap-rails'

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Я снова все делаю и работает !! Единственное, что мне пришлось изменить в вашем коде:

  • наследует сообщество от ActiveRecord (для использования has_many) и
  • изменить метод собственного класса Self.save_both_a_new_user_and_a_new_instance (пользователь) на self.save_both_a_new_user_and_a_new_instance (пользователь).

Спасибо !!

0 голосов
/ 19 марта 2012

Да, конечно, я думаю, вам нужно настроить свой Devise Controller.

step1.создайте свой локальный файл контроллера Devise (запустив собственную задачу rake генератора или вручную скопировав его контроллер в локальную папку), после этого структура вашей папки должна выглядеть следующим образом:

app/controllers/devise/registrations_controller.rb
app/views/devise/registrations/new.html.erb
app/views/devise/registrations/edit.html.erb

step2.отредактируйте ваше приложение / controllers / devise / registrations_controller.rb:

# POST /resource
def create
  build_resource
  if resource.save   # change this line of code. 
    if resource.active_for_authentication?
      redirect_to root_path, :notice => "successfully registered..."
    else
      # other code ....
    end 
  else
    clean_up_passwords resource
    respond_with resource
  end 
end 

измените файл выше,

if resource.save   # change this line of code. 

на:

if Community.save_both_a_new_user_and_a_new_instance(resource)

Step3.реализовать метод в Сообществе, используя транзакцию:

class Community
  def Self.save_both_a_new_user_and_a_new_instance(user)
     Community.transaction do 
       community = Community.new(:name => "new community")
       user.community = community
       community.save!
       user.save!
     end 
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...