Rails3嵌套属性验证和控制

时间:2011-11-21 20:53:51

标签: ruby-on-rails ruby ruby-on-rails-3

遗憾的是,我正在使用遗留数据库,我正在尝试围绕它构建我的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

1 个答案:

答案 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模型中添加此类其他验证。

请参阅以下链接RailsCastsComplex form codes