我使用设计进行身份验证。我有一个用于访问first_name
和last_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输入字段,我目前在表格中有。一旦我提交了这个表单,我想:
使用此
: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 } %>
将
full_name
参数拆分(或以某种方式解析)为first_name
和last_name
(如果您愿意,可以随意将此方法保留为空,只需将其放置在正确的位置)将
: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_name
和last_name
属性。
上面的方法只有可以很好地处理两个名称。整理其他名字是另一个问题。
3。看到# 2
您必须记住,除了提供控制器支持外,Devise
与User
模型无关。
实际的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