Ruby on rails 3 想组成一个;电子邮件id“;带有可编辑的文本字段;用户名";和一个常数;域名;

Ruby on rails 3 想组成一个;电子邮件id“;带有可编辑的文本字段;用户名";和一个常数;域名;,ruby-on-rails-3,Ruby On Rails 3,我正在创建一个具有域和用户的应用程序。管理员可以选择任何域并在该域内创建用户。在新用户创建视图中,我有一个电子邮件字段。目前我正在通过输入完整的电子邮件id创建新用户,如“sam@exmple.com“。我想分割电子邮件id,以便只需要使用文本字段插入“用户名(sam)”部分。 提交表单时,“@domain”部分会附加用户名。我希望有一个视图,其中会有一个电子邮件部分,其中包含用户名文本字段,后跟@domain name(从数据库填充,正在填充)。这是我目前的看法 <%= form_for

我正在创建一个具有域和用户的应用程序。管理员可以选择任何域并在该域内创建用户。在新用户创建视图中,我有一个电子邮件字段。目前我正在通过输入完整的电子邮件id创建新用户,如“sam@exmple.com“。我想分割电子邮件id,以便只需要使用文本字段插入“用户名(sam)”部分。 提交表单时,“@domain”部分会附加用户名。我希望有一个视图,其中会有一个电子邮件部分,其中包含用户名文本字段,后跟@domain name(从数据库填充,正在填充)。这是我目前的看法

<%= form_for @user do |f| %>
  <%= f.hidden_field :domain_id %>  

  <%= f.label :email %>
  <%= f.text_field(:email, :size => 20) %>

  <%= f.submit "Create" %>

<% end %>
然后正确保存电子邮件id。(如sam@example.com) 因为我有很多域,所以我想动态地构建这个域部件

domain = @domain.domain_name
我得到错误为“未定义的方法域名”。
我猜这是因为我的用户模型中的实例域不可用。你能告诉我,我哪里做错了。有没有其他办法?

我不理解你文章的这一部分:“我希望有一个视图,其中有一个电子邮件部分,其中有一个用户名文本字段,后跟@domain name(从数据库填充,填充正在进行)。这是我当前的视图”

你能详细说明/改写一下吗?:)

除此之外,还有一个想法。定义:

attr_accessor :user_name
在您的用户模型中。然后你可以在表格中写下这样的内容:

<%= f.text_field(:username, :size => 20) %>
编辑:

好的,首先,您没有访问模型中@domain的权限。它在控制器中定义,在那里和视图中都可用

其次,我看到您使用的是
@domain.users.build
,所以我猜domain
有很多:users
,User
属于:domain
,对吗

如果是这样,您可以这样编写您的撰写电子邮件方法:

def compose_email
      domain = domain.domain_name  #we are using AR association here and we are calling domain on self, which is instance of user here, by default
      self.email = "#{email}@#{domain}"
end

非常感谢你的建议。我将努力实施它。我已经更新了我的帖子,请建议是否可以简化。好吧,我想我的答案回答了你的问题。在我的解决方案中,用户只输入用户名。在创建回调之前,电子邮件由用户名和域组成:)我已经按照你说的做了相应的操作。但我无法构建域,因为它需要类似于[at]domain.domain\u name的东西。可在用户控制器上使用。我正在尝试“domain=@domain.domain\u name”,但出现错误“undefined method domain\u name”。请您建议我如何构建域。我需要更多数据来帮助您,您可以粘贴视图中使用的表单,控制器中的代码和模型中的代码:)现在我只能猜测,当涉及到MVC模式时,您做错了什么。我已经更新了这个问题。我想,我没有遵循MVC模式。
domain = @domain.domain_name
attr_accessor :user_name
<%= f.text_field(:username, :size => 20) %>
before_create :compose_email

def compose_email
domain = ... #prepare domain here 
self.email = "#{user_name}#{domain}"
end
def compose_email
      domain = domain.domain_name  #we are using AR association here and we are calling domain on self, which is instance of user here, by default
      self.email = "#{email}@#{domain}"
end