我有一个社区模型,其中包含has_many:users,以及belongs_to:community的用户模型。
我需要在用户注册时在同一过程中创建社区,并在注册时分配给此社区。如果没有创建社区,则不应创建用户。
我该怎么办?也许为用户创建一个自定义设计控制器...任何想法都将不胜感激。
由于
第一次回复更改后:
应用程序/控制器/设计/ 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
应用程序/视图/设计/注册/ 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" %>
应用程序/视图/设计/注册/ 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'
答案 0 :(得分:0)
是的,当然,我认为您必须自定义您的Devise Controller。
步骤1。创建本地Devise控制器文件(通过运行自己的生成器rake任务或手动将其控制器复制到本地文件夹),之后,您的文件夹结构应如下所示:
app/controllers/devise/registrations_controller.rb
app/views/devise/registrations/new.html.erb
app/views/devise/registrations/edit.html.erb
步骤2。编辑你的app / 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)
步骤3。使用事务在社区中实现该方法:
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
答案 1 :(得分:0)
我重新做这一切并且工作!!我必须从您的代码中更改的唯一内容是:
谢谢!