Rails基于注册ID运行inbuilt方法

时间:2016-02-14 07:08:44

标签: ruby-on-rails ruby-on-rails-4

我的应用程序设置为用户注册时,为他们创建了配置文件,因此我在配置文件的模型上使用before_create :build_profile和外键user_id

用户模型:

...

has_one :profile
before_create :build_profile #-> inbuilt method

...

现在我有两种注册类型:reg1和reg2。 Reg2只能有一个公司简介,所以这里有问题。我可以在注册期间根据用户注册类型建立公司资料吗?这是图片:

用户模型:

...

before_create :build_profile #-> inbuilt method
has_one :company
# before_create :build_company if registration_id == 2

...

注册模型的创建方式如下:

Registration.create(name: 'foo', company_id: 2)

用户表具有外键:

...

:registration_id => :integer,

...

因此,当创建用户并将其注册设置为2时,我想运行:build_company。这可能吗?

我的回答的理由,请纠正我!!

我的设计registration_controller.rb:

def create
    super do |resource|
        if params[:registration_id]
            resource.registration_id = params[:registration_id]
            if resource.registration_id == 2
                resource.save
            elsif resource.registration_id == 1
                resource.save!
            end
        end
    end
end

我的注册视图表单有这个hidden_​​field:

<%= hidden_field_tag 'registration_id', params[:registration_id] %>

所以请告诉我为什么要投票?

1 个答案:

答案 0 :(得分:-1)

您可以使用Ruby ActiveRecord::Callbacks来执行创建用户之前或之后发生的事情。您需要在用户保存到数据库后创建的用户ID,您需要使用... after_save :create_company # no need for this (updated) has_one :profile has_one :company before_create :build_profile #-> inbuilt method def create_company if self.registration_id == 2 c = Company.new(user_id: self.id, registration_id: 2) #assigns the user_id to company. c.save end end ... 回调:

<强> User.rb:

user.rb

重启我的服务器后,我现在看到了错误。很奇怪它如何工作直到重新启动。不管怎样,我已经看到了你们所说的话,抱歉这么天真。我从registration_controller.rb删除了该方法并更改了def create super do |resource| if params[:registration_id] resource.registration_id = params[:registration_id] if resource.registration_id == 2 resource.save!(Company.create(user_id: User.last.id, registration_id: 2)) elsif resource.registration_id == 1 resource.save! end end end end

int main(int argc, char *argv[])
    {
        FILE* fp = fopen("test.txt","rw");
        int n,m,q;
        scanf(" %d%d%d",&n,&m,&q);
        struct test_t test;
        while (fscanf(fp,"%d%s%d%d%d%d%d%d%d%*d",&test.line,test.data,&test.number[0],&test.number[1],&test.number[2],&test.number[3],&test.number[4],&test.number[5],&test.number[6])!=EOF) {
                //do something.....
        }
        return 0;
    }