设计注册控制器-拆分全名并填充姓和名属性



我使用设计进行身份验证。我有一个用于访问first_namelast_name的注册表单,作为设计用于创建资源(在本例中为用户)的操作的一部分。First_name和last_name是User模型的属性。

<% simple_form_for resource ... %>  
<%= f.input :first_name, label: false, placeholder: "Family Member's First Name", input_html: { maxlength: 15, size: 40, value: nil } %>
<%= f.input :last_name, label: false, placeholder: "Family Member's Last", input_html: { maxlength: 15, size: 40, value: nil } %>
<%= ...more fields %>
< % end %>

这工作得很好,但我想改变形式。我想提交:full_name作为一个单一的输入字段,以取代两个:first_name和:last_name输入字段,我目前在表格中有。一旦我提交了这个表单,我想:

  1. 使用此:full_name属性(未存储在模型中)代替:first_name:last_name作为提交参数的一部分

    <%= f.input :full_name, label: false, placeholder: "Family Member's Name", input_html: { maxlength: 15, size: 40, value: nil } %>
    
  2. full_name参数拆分(或以某种方式解析)为first_namelast_name(如果您愿意,可以随意将此方法保留为空,只需将其放置在正确的位置)

  3. :first_name保存为first_name, :last_name保存为last _name。(这是我最关心的)

我看到其他的答案解释如何解析名称或使用属性在设计不是在模型中,但我找不到如何保存变量作为资源的一部分,是在表单提交后创建的

1。虚拟属性

您将能够在模型中使用attr_accessor方法创建一个虚拟属性:

#app/models/user.rb
class User < ActiveRecord::Base
   attr_accessor :full_name
end

您仍然需要对该attr进行消毒(它只是没有被保存),无论如何您都要这样做。

2。在User模型中使用before_validation回调

#app/models/user.rb
class User < ActiveRecord::Base
   attr_accessor :full_name
   before_validation :set_names
   private
   def set_names
      names = full_name.split
      self.first_name = names.first
      self.last_name = names.last
   end
end

这将接受full_name提交的虚拟属性,将其分割成一个数组,然后用结果填充first_namelast_name属性。

上面的方法只有可以很好地处理两个名称。整理其他名字是另一个问题。

3。看到# 2


您必须记住,除了提供控制器支持外,DeviseUser模型无关。

实际的User数据(超过devise参数)完全取决于您-我们甚至使用Profile模型绑定到User:

#app/models/user.rb
class User < ActiveRecord::Base
   has_one :profile
   before_create :build_profile
end 
#app/models/profile.rb
class Profile < ActiveRecord::Base
   belongs_to :user
end

您尝试过虚拟属性吗?有一个很棒的铁路广播,你想做什么http://railscasts.com/episodes/16-virtual-attributes?view=asciicast

最新更新