Ruby on rails 使用用户和多态性工具登录(Rails 4)

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

在我的Rails应用程序中,我引入了一种从不同用户组登录的方法

我有一个用户模型:

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