Rails 4 - 检查匹配属性的方法

时间:2016-01-29 01:16:12

标签: ruby-on-rails methods devise

我正在尝试在Rails 4中创建一个应用程序。

我正在使用设计,并希望根据以下逻辑编写后注册重定向路径。

我有一个包含:email属性的用户模型。我有一个组织模型,其中包含:email_format属性(电子邮件属性包含在' @'之后的电子邮件地址的一部分。我有一个配置文件模型(其中包含用户的信息,可由用户自己改变。)

协会是:

用户 - has_one:个人资料 个人资料 - belongs_to:user,belongs_to:organization 组织 - has_many:个人资料

如果用户(注册)输入的电子邮件地址包含保存在数据库中的电子邮件格式,那么我想将该新用户的配置文件与具有匹配电子邮件格式的组织相关联。

示例:

新用户:email = bob@cat.com

然后我检查组织表以查看是否存在任何:email_attributes' cat.com'。

如果是,则新用户的用户配置文件与具有匹配的email_format的组织相关联(因此相关配置文件表中的organisation_id设置为与该组织ID匹配)。

这是我写这篇文章的最佳尝试:

注册管理员:

  def after_sign_up_path_for(resource)
    # check if the email address the user used to register includes the email format of an organisation
    if  @user.email.includes? @organisation(:email_format) 

    # if it does match, then update the user profile so that the org id equals the org id for the org that has the matching email format     

      @user.profile.organisation_id.update_attribute(organisation.id == (@organisation.email includes? :email_format)) 
    else
      # set up a mandrill email sender to send this message
      set_flash_message('We are just getting started and will get in touch with 
        you as soon as we have onboarded your organisation')

    end
  end

我对此很陌生,并且不了解如何正确查询。任何指针都会非常感激。

下次尝试

根据以下建议,我尝试将after_create回调添加到我的个人资料模型中,如下所示:

after_create :update_organisation

  def update_organisation
    Profile.update_attribute(organisation_id: :matching_org_id) # Associations must be defined correctly for this syntax, avoids using ID's directly.
    # Profile.save
  end


  def matching_org_id
    if @self.user.email.includes? @organisation(:email_format) 
# how do you ask for the organisation with the matching email format id

        profile.organisation_id: organisation.id
    else
      TBC
    end
  end

这不起作用。我不确定如何正确表达这种方法。我目前收到的错误是:

syntax error, unexpected '(', expecting keyword_then or ';' or '\n' if @self.user.email.includes? @organisation(:email_format)

1 个答案:

答案 0 :(得分:0)

第一个问题:

这部分非常危险:你可能会bobcat.com@gmail.com返回误报。

if  @user.email.includes? @organisation(:email_format) 

也许您可以使用存储正则表达式格式并通过

进行检查
/@cat.com$/ =~ @user.email

尝试rubular.com

的格式

第二个问题:

更新方法应与此类似。

@user.profile.update(organisation_id: @matching_organisation.id)

您需要遍历所有组织才能找到匹配的组织。

第三个问题

我认为这是一个做这种操作的坏地方。您应该向用户模型添加after_create hook并将这些逻辑放在该方法中。