遗憾的是,我正在使用遗留数据库,我正在尝试围绕它构建我的rails3应用程序。
感谢this之前的帖子,我已经知道我要去哪里,但仍然认为我接近错误。
我的基本问题是我的主要数据存储在一个包含多行的表中,每行都有不同的属性值:
+-----+----------+----------------+----+---------------+------------+
| id | username | attribute_name | op | value | raduser_id |
+-----+----------+----------------+----+---------------+------------+
| 173 | jenny | User-Password | := | March 25 2011 | 33 |
| 172 | jenny | User-Password | := | 1234 | 33 |
+-----+----------+----------------+----+---------------+------------+
2 rows in set (0.00 sec)
我使用嵌套表单输入此信息,但它并没有真正做我需要的。我现在可以添加嵌套属性并设置一个字段,这要归功于上一个问题。
我遇到的问题是我需要更多地控制用户的输入。例如,我需要将它们限制为三个不同的属性:
用户密码,过期,同时使用
我还需要验证字段。我不能使用嵌套表单。
我的计划是让用户在父模型中输入这些内容并向下传播,但我不知道如何执行此操作并保存到单独的行,就像我使用嵌套的属性一样。
任何人都可以对此有所了解吗?
- UPDATE -
raduser.rb
class Raduser < ActiveRecord::Base
has_many :radcheck, :dependent => :destroy
accepts_nested_attributes_for :radcheck, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true
end
radcheck.rb
class Radcheck < ActiveRecord::Base
set_table_name 'radcheck'
attr_accessible :attribute_name, :username, :value, :op, :groupname
belongs_to :raduser
has_many :radusergroup, :dependent => :destroy, :primary_key => :username, :foreign_key => :groupname
has_many :radgroupcheck, :through => :radusergroup
before_save :sync_usernames
private
def sync_usernames
self.username = self.raduser.username
end
end
答案 0 :(得分:0)
您是否尝试在radcheck.rb
模型中放置验证?试试这段代码:
radcheck.rb
class Radcheck < ActiveRecord::Base
set_table_name 'radcheck'
attr_accessible :attribute_name, :username, :value, :op, :groupname
belongs_to :raduser
validates :attribute_name, :inclusion => { :in => %w(User-Password Expiration Simultaneous-Use) }
before_save :sync_usernames
private
def sync_usernames
self.username = self.raduser.username
end
end
raduser.rb
class Raduser < ActiveRecord::Base
has_many :radcheck, :dependent => :destroy
accepts_nested_attributes_for :radcheck, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true
end
radusers_controller.rb
def new
@raduser = Raduser.new
@raduser.radcheck.build
end
def create
@raduser = Raduser.new(params[:raduser])
if @raduser.save
redirect_to(@raduser, :notice => 'Raduser was successfully created.')
else
render :action => "new"
end
end
最后是表格
<% if @raduser.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@raduser.errors.count, "error") %> prohibited this raduser from being saved:</h2>
<ul>
<% @raduser.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= form_for @raduser do |f| %>
<p>
<%= f.label :username %><br />
<%= f.text_field :username %>
</p>
<%= f.fields_for :radcheck do |builder| %>
<li>
<%= builder.label :attribute_name %>
<%= builder.text_field :attribute_name %>
</li>
<% end %>
<p><%= f.submit "Submit" %></p>
<% end %>
当我尝试使用除用户密码,到期,同时使用之外的属性名称保存时,它正在提供
1 error prohibited this raduser from being saved:
- Attribute name is not included in the list
如果要更改消息,可以将:message
添加到验证中。您可以在Radcheck
模型中添加此类其他验证。
请参阅以下链接RailsCasts,Complex form codes