2014-09-19 28 views
0

我是新来的rails,并且我有嵌套窗体和所有这些问题。 我有一个用户模型和一个组织模型。 当我想创建一个用户时,我想指定他来自哪个组织。 组织名称已经存在于数据库中,或者如果不存在,我想创建一个新记录并将该记录与用户模型相关联。rails自动完成如何使用exising记录

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

模型/ organization.rb

class Organization < ActiveRecord::Base 

    has_many :user 

    validates_presence_of :name 


end 

模型/ user.rb(短)

class User < ActiveRecord::Base 
    belongs_to :organization 
    accepts_nested_attributes_for :organization 
    ##### 
end 

由此看来,在控制台中,我可以创建用户并指定和组织名称,它将为该用户创建一个新记录并为该组织创建一个新记录。 问题是,每次创建一个新组织

我希望能够将已经存在的组织关联到新用户。 我可以通过typeahead.js这个表单获得组织的列表,所以当用户选择一个名称时,名称是相同的。但我不知道如何将两者联系起来(新创建的用户和现有的组织)。

我想将组织的id放在隐藏字段中,并检查控制器是否存在此id。如果确实如此,就把这个ID,如果它不创建一个新的。但我甚至不知道如何做到这一点。在控制台中,当我更新用户的属性,例如,与存在的的organization_ID = 3:

u.update_attributes(:organization_attributes => { id: 3 }) 

它拒绝说他没有找到ID用户= ...与组织。 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 

+ user_controller(强PARAMS)

def user_params 
    params.require(:user).permit(:lname,:email,:fname,:password,:password_confirmation, 
           :gender,:role,:display_private,:link_li,:country,:city,:phone,:hobbies, 
           :avatar,:org_name, :organization_attributes => [ :id, :name]) 
end 

+ form.html。ERB

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

它应该是'的has_many:用户在组织 – 2014-09-19 14:35:17

回答

1

我会写这个自定义方法:

#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_name像用户的属性,并把它放在一个表单字段一样

f.input :organization_name 

输入将从@user.organization_name和C会不会让当前值所有@user.organization_name=具有新的价值。

+0

让我试试这个然后... =)但我已经做了一个编辑,对我来说我的解决方案应该可以工作,但它不会,有些东西我没有得到.. – Nikkolasg 2014-09-19 14:44:43

+0

它的工作perf真的!谢谢 !! – Nikkolasg 2014-09-19 15:07:06

0

首先从模型中拿走accep_nested_attributes。 然后在你的控制器,你应该这样做:

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 
+0

试试看。我刚刚根据您刚刚发布的控制器代码进行了编辑。 – spiria 2014-09-19 14:57:01

+0

好眼睛,错过了。第一。 – spiria 2014-09-19 15:04:28

+0

这与我在控制器中完成的基本相同,但是在控制台中没有解决。另外,我认为这个解决方案每次都会创建一个新的组织记录,并且与之前存在的相关...... – Nikkolasg 2014-09-19 15:07:49

0

在您的应用程序/模型/ 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 

在users_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