用设计签约

时间:2012-03-18 21:53:56

标签: ruby-on-rails devise

我有一个社区模型,其中包含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'

2 个答案:

答案 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)

我重新做这一切并且工作!!我必须从您的代码中更改的唯一内容是:

  • 从ActiveRecord继承社区(用于使用has_many)和
  • 将自我类方法Self.save_both_a_new_user_and_a_new_instance(user)更改为self.save_both_a_new_user_and_a_new_instance(user)。

谢谢!