Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails自动完成如何使用现有记录_Ruby On Rails_Ruby_Nested Forms_Model Associations - Fatal编程技术网

Ruby on rails rails自动完成如何使用现有记录

Ruby on rails rails自动完成如何使用现有记录,ruby-on-rails,ruby,nested-forms,model-associations,Ruby On Rails,Ruby,Nested Forms,Model Associations,我是rails新手,我对嵌套表单和所有这些都有问题。 我有一个用户模型和一个组织模型。 当我想创建一个用户时,我想指定他来自哪个组织。 组织名称已经在数据库中,或者如果没有,我想创建一个新记录并将该记录与用户模型相关联 我很难理解rails框架中的所有关系(多对多等),但到目前为止我已经了解了这一点 模型/组织。rb class Organization < ActiveRecord::Base has_many :user validates_presence_of

我是rails新手,我对嵌套表单和所有这些都有问题。 我有一个用户模型和一个组织模型。 当我想创建一个用户时,我想指定他来自哪个组织。 组织名称已经在数据库中,或者如果没有,我想创建一个新记录并将该记录与用户模型相关联

我很难理解rails框架中的所有关系(多对多等),但到目前为止我已经了解了这一点

模型/组织。rb

class Organization < ActiveRecord::Base

   has_many :user  

   validates_presence_of :name


end
<%= u.fields_for :organization do |o| %>
                                <%= o.label "Organization" %>
                                <!-- PUT ORGA -->
                                <%= o.text_field :name, class:"form-control" %>
<% end %>
它拒绝说他没有找到ID为的用户。。。当Organization.id=3时。。。 我不明白

我想,既然这是一个常见的情况,这应该很容易,但这会扰乱我的头脑

如果有人愿意向我解释,我将非常感激

多谢各位

编辑 我刚刚在控制器中尝试了一些东西,但也不起作用

 def create

    @user = User.new(user_params) # :user object built from user inputform        
    org = Organization.find_by(name:user_params[:organization_attributes][:name])
    if org 
        @user.organization.id = org.id
    end
    if @user.save
        # signin the user (token etc)
        sign_in @user
        flash[:success] = "Registration sucessfull !"
        redirect_to @user 
    else
        render 'new'
    end
end
+用户\u控制器(强参数)

+form.html.erb

class Organization < ActiveRecord::Base

   has_many :user  

   validates_presence_of :name


end
<%= u.fields_for :organization do |o| %>
                                <%= o.label "Organization" %>
                                <!-- PUT ORGA -->
                                <%= o.text_field :name, class:"form-control" %>
<% end %>

我将为此编写一个自定义方法:

#in User
def organization_name
  (org = self.organization) && org.name
end

def organization_name=(name)
  if org = Organization.find_by_name(name)
    self.organization = org
  else
    self.organization = Organization.create(:name => name)
  end
end
现在,因为您有一个getter和setter方法(即除了=符号之外,还有两个名称相同的方法),所以可以将
organization\u name
视为User的属性,并将其放在表单字段中,如

f.input :organization_name

输入将从
@user.organization\u name
获取当前值,并使用新值调用
@user.organization\u name=

首先从模型中删除accepts\u nested\u属性。 然后在控制器中,您应该执行以下操作:

def create

    @user = User.new(user_params) # :user object built from user inputform        
    org = Organization.where(name: user_params[:organization_attributes][:name]).first || Organization.create(name: user_params[:organization_attributes][:name])
    @user.organization = org

    if @user.save
        # signin the user (token etc)
        sign_in @user
        flash[:success] = "Registration sucessfull !"
        redirect_to @user 
    else
        render 'new'
    end
end

在你的app/model/user.rb中

def self.create(name, attribute1, ... ,organization)
   user = User.new(:name => name, :atr_1 => attribute_1, ....:atr_n => attribute_n)
   user.organization = organization
   raise "user not created" if !user.save
   user
end
在用户_controller.rb中

def create
   org = Organization.find params['organization'] #expecting the param to be Organization#id
   user = User.create(params['name'], ..., org)
   render :json => {:message => "user created"}
end

应该是
在组织中有很多:用户让我试试这个…=)但我已经做了编辑,对我来说,我的解决方案应该是可行的,但它不可行,有一些东西我不明白……试试这个。我只是根据你刚刚发布的控制器代码进行了编辑。眼光好,错过了。首先。这基本上和我在控制器中所做的一样,但在控制台中不起作用。另外,我认为这个解决方案每次都会创建一个新的组织记录,并且只与以前存在的记录相关。。。
def create
   org = Organization.find params['organization'] #expecting the param to be Organization#id
   user = User.create(params['name'], ..., org)
   render :json => {:message => "user created"}
end