Ruby on rails 使用用户和多态性工具登录(Rails 4)
在我的Rails应用程序中,我引入了一种从不同用户组登录的方法 我有一个用户模型:Ruby on rails 使用用户和多态性工具登录(Rails 4),ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的Rails应用程序中,我引入了一种从不同用户组登录的方法 我有一个用户模型: class User < ActiveRecord::Base .... belongs_to :operator, polymorphic: true end 活动记录协会 一切都很好,但我有一个新用户登录的问题 假设我们想要创建一个新的客户端。 在我的客户_controller.rb中,我有 . . . def create @client = Client.ne
class User < ActiveRecord::Base
....
belongs_to :operator, polymorphic: true
end
活动记录协会
一切都很好,但我有一个新用户登录的问题
假设我们想要创建一个新的客户端。
在我的客户_controller.rb中,我有
.
.
.
def create
@client = Client.new(client_params)
@user = User.new(user_params)
if @client.save && @client.create_user(user_params)
redirect_to @client
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:username, :password, :password_confirmation)
end
def client_params
params.require(:client).permit(:description)
end
end
为了完整起见,这是新的相关的.html.erb(标签为意大利语:
<div class ="row">
<div class="col-md-6 col-md-offet-3 box">
<%= form_for @client do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label 'Nome Azienda' %>
<%= f.text_field :description, class: 'form_control' %>
<%= fields_for @user do |g| %>
<%= g.label 'inserire una username' %>
<%= g.text_field :username, class: 'form_control' %>
<%= g.label 'inserire una password' %>
<%= g.password_field :password, class: 'form_control' %>
<%= g.label 'ripetere la password' %>
<%= g.password_field :password_confirmation, class: 'form_control' %>
<% end %>
<%= f.submit "Crea l'account", class: "btn btn-primary" %>
<% end %>
</div>
</div>
我知道它不是那么优雅,也不会同时显示所有错误:如果客户端验证和用户验证中存在问题,那么现在会显示相关的用户错误。您可以根据需要修改创建方法
def create
@client = Client.new(client_params)
@user = User.new(user_params)
@errors = []
if @client.save && @user.save
@client.user.save = @user
@client.save
redirect_to @client
else
@errors << @client.errors.full_messages if @client.errors.any?
@errors << @user.errors.full_messages if @user.errors.any?
render 'new'
end
end
def创建
@client=client.new(客户端参数)
@user=user.new(用户参数)
@错误=[]
如果@client.save&&@user.save
@client.user.save=@user
@client.save
将_重定向到@client
其他的
@错误有一个名为transaction的ActiveRecord操作,它将解决部分问题,仅当所有受影响的记录都有效时才进行保存。必须成功完成事务块中的所有操作,否则db将回滚事务中的所有操作
def create
@client.transaction do
@client = Client.new!(client_params)
@user = User.new!(user_params)
end
end
更多信息:好的,我决定从您的答案中汲取一些想法,并使用以下代码:
def create
@client = Client.new(client_params)
@user = @client.create_user(user_params)
if @client.save && @user.save
redirect_to @client
else
@client.destroy
render 'new'
end
end
奇怪的是,我需要再次保存“create_user”操作,但它解决了需要。而且,它会产生所有可以方便显示的错误。我不确定它是否有用。我没有“false”从控制器方便地管理条件,我无法捕获反馈错误。我可以管理异常,但感觉这是一个很大的困难增加。回滚不是主要问题。好的。我不认为我理解你的问题。但希望你能得到答案。我会继续并显式保存这两个模型。我如果一个失败,那么两个都将退出事务,这样您就不会错过任何验证错误。我已经按照您的想法添加了一个.save:if@client.save&&@client.create_user(user_参数).save…它确实会运行,但再次保存以强制检查是很奇怪的。现在的问题是从该调用中捕获错误。有什么想法吗?你的想法很有趣。问题是从@client.create_user(..)捕获错误。save
def create
@client.transaction do
@client = Client.new!(client_params)
@user = User.new!(user_params)
end
end
def create
@client = Client.new(client_params)
@user = @client.create_user(user_params)
if @client.save && @user.save
redirect_to @client
else
@client.destroy
render 'new'
end
end