Ruby on rails Rails-正确/更好地建立属于/拥有许多关系
我正在创建一个应用程序,用户可以通过它创建帐户。当他们创建一个帐户时,以同样的形式,他们将能够创建一个组织,然后该组织将绑定到他们的用户。一旦该用户创建了自己的帐户(和组织),其他用户就可以创建帐户并使用“访问代码”加入该组织。查看代码可以更好地解释它 我之所以如此发帖,是因为我觉得有一种比我现在做的更好/更有效的方法。我使用的是嵌套表单(可能不正确),我认为我没有正确地进行关联,因为,例如,我无法获得编辑表单来填写组织字段 我也在使用巫术进行身份验证 用户\u controller.rbRuby on rails Rails-正确/更好地建立属于/拥有许多关系,ruby-on-rails,associations,nested-forms,Ruby On Rails,Associations,Nested Forms,我正在创建一个应用程序,用户可以通过它创建帐户。当他们创建一个帐户时,以同样的形式,他们将能够创建一个组织,然后该组织将绑定到他们的用户。一旦该用户创建了自己的帐户(和组织),其他用户就可以创建帐户并使用“访问代码”加入该组织。查看代码可以更好地解释它 我之所以如此发帖,是因为我觉得有一种比我现在做的更好/更有效的方法。我使用的是嵌套表单(可能不正确),我认为我没有正确地进行关联,因为,例如,我无法获得编辑表单来填写组织字段 我也在使用巫术进行身份验证 用户\u controller.rb de
def new
@user = User.new
end
def create
@user = User.new(user_params)
if params[:user][:organization][:name].blank?
flash.now[:error] = "You must specify an organization name."
render :new
else
if params[:user][:organization][:access_code].blank?
# create new organization
@access_code = "#{SecureRandom.urlsafe_base64(16)}#{Time.now.to_i}"
@organization = Organization.create(:name => params[:user][:organization][:name], :access_code => @access_code)
@user.organization_id = @organization.id
@user.is_admin = true
else
# try and add someone to an organization
@organization = Organization.find(:all, conditions: ["name = ? AND access_code = ?", params[:user][:organization][:name], params[:user][:organization][:access_code]])
if @organization.empty?
flash.now[:error] = "No organization has been found with that name and access code."
render :new
return
else
@user.organization_id = @organization.first.id
end
end
if @user.save
user = login(@user.email, params[:user][:password])
if user
flash[:success] = "Your account has been successfully created!"
redirect_to admin_dashboard_path
end
else
flash.now[:error] = "Something went wrong! Please try again."
render :new
end
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.is_admin?
if params[:user][:organization][:name].blank? && params[:user][:organization][:name] != @user.organization.name
params[:user][:organization][:name] = @user.organization.name
end
if params[:user][:organization][:access_code].blank? && params[:user][:organization][:access_code] != @user.organization.access_code
params[:user][:organization][:access_code] = @user.organization.access_code
end
@organization = Organization.find(params[:user][:organization_id])
@organization.name = params[:user][:organization][:name]
@organization.access_code = params[:user][:organization][:access_code]
@organization.save
end
if @user.update(user_params)
flash[:success] = "Your settings have been updated!"
redirect_to edit_admin_user_path(@user.id)
else
flash.now[:error] = "Something went wrong! Please try again."
render :edit
end
end
private
def user_params
params.require(:user).permit(:organization_id, :email, :password, :password_confirmation, :full_name, :remember_me, {:organization_attributes => [:name, :website, :description, :access_code]})
end
users.rb
class User < ActiveRecord::Base
authenticates_with_sorcery!
belongs_to :organization
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates_presence_of :full_name
validates_presence_of :email
validates_uniqueness_of :email, :on => :create
validates_format_of :email, :with => VALID_EMAIL_REGEX, :on => :create
validates_presence_of :password, :on => :create
validates_confirmation_of :password
end
class用户:create
验证以下内容的格式:email,:with=>VALID\u email\u REGEX,:on=>:create
验证是否存在:password,:on=>:create
验证密码的确认
结束
organization.rb
class Organization < ActiveRecord::Base
authenticates_with_sorcery!
has_many :users, :dependent => :destroy
accepts_nested_attributes_for :users
validates_presence_of :name
end
类组织:销毁
接受用户的\u嵌套\u属性\u
验证是否存在:name
结束
new.html.erb
<% provide(:title, 'Create a User') %>
<h1>Create a User</h1>
<p>Use the form below to create an account.</p>
<%= nested_form_for([:admin, @user], html: {role: "form"}) do |f| %>
<%= render "shared/error_messages", obj: @user %>
<fieldset>
<legend>User Information</legend>
<div class="form-group">
<%= f.label :full_name, "Full Name" %>
<span class="help-block">How should others see you?</span>
<%= f.text_field :full_name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email %>
<span class="help-block">Your email address is used as your login.</span>
<%= f.text_field :email, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, class: "form-control" %>
</div>
</fieldset>
<%= f.fields_for :organization do |o| %>
<fieldset>
<legend>Associated Organization</legend>
<div class="form-group">
<%= o.label :name, "Organization Name" %>
<span class="help-block">This is the name of the organization you are a part of.</span>
<%= o.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= o.label :access_code, "Organization Access Code" %>
<span class="help-block">Leaving this field blank will setup a new organization.</span>
<%= o.text_field :access_code, class: "form-control" %>
</div>
</fieldset>
<% end %>
<div class="form-actions">
<%= f.submit "Create Account", class: "btn btn-primary" %>
<%= link_to "Cancel", :back, class: "text-btn" %>
</div>
<% end %>
创建用户
使用以下表格创建帐户
用户信息
别人怎么看你?
您的电子邮件地址将用作您的登录名。
关联组织
这是您所在组织的名称。
将此字段留空将设置一个新组织。
edit.html.erb
<% provide(:title, "Edit User: #{@user.full_name} (#{@user.organization.name})") %>
<h1>Edit User: <%= @user.full_name %> (<%= @user.organization.name %>)</h1>
<p>Use the form below to manage your account.</p>
<%= nested_form_for([:admin, @user], html: {role: "form"}) do |f| %>
<%= render "shared/error_messages", obj: @user %>
<fieldset>
<legend>User Information</legend>
<div class="form-group">
<%= f.label :full_name, "Full Name" %>
<span class="help-block">How should others see you?</span>
<%= f.text_field :full_name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email %>
<span class="help-block">Your email address is used as your login.</span>
<%= f.text_field :email, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, placeholder: "leave blank to keep password unchanged", class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, class: "form-control" %>
</div>
</fieldset>
<% if @user.is_admin? %>
<%= f.fields_for :organization do |o| %>
<fieldset>
<legend>Associated Organization</legend>
<div class="form-group">
<%= o.label :name, "Organization Name" %>
<span class="help-block">This is the name of the organization you are a part of.</span>
<%= o.text_field :name, class: "form-control", value: @user.organization.name %>
</div>
<div class="form-group">
<%= o.label :access_code, "Organization Access Code" %>
<span class="help-block">Leaving this field blank will setup a new organization.</span>
<%= o.text_field :access_code, class: "form-control", value: @user.organization.access_code %>
</div>
</fieldset>
<% end %>
<%= f.hidden_field :organization_id %>
<% end %>
<div class="form-actions">
<%= f.submit "Update User", class: "btn btn-primary" %>
<%= link_to "Cancel", :back, class: "text-btn" %>
</div>
<% end %>
编辑用户:()
使用以下表格管理您的帐户
用户信息
别人怎么看你?
您的电子邮件地址将用作您的登录名。
关联组织
这是您所在组织的名称。
将此字段留空将设置一个新组织。
好的,这些都是使它发生的文件。现在,我让应用程序完成了我需要它完成的几乎所有事情,但我觉得这不像是生产级代码
我知道我遇到的一个问题是,如果用户在organization字段中键入了某个内容,而没有键入其他内容,则控制器将创建并保存该组织,然后使用用户验证错误返回表单。如果用户模型中存在验证错误,我不希望它保存组织
我真的只是征求意见,如果有更好的方法做我想做的事。如果你不能确切地告诉我,我试图用这个代码做什么,或者有任何问题,请让我知道 看看这篇文章:
特别有趣的是“3.提取表单对象”部分。谢谢!我来看看那个参考资料。