2011-11-21 59 views
0

不幸的是,我正在使用遺留數據庫進行滾動,並試圖圍繞它構建我的rails3應用程序。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

我不知道你的數據model..can你給在radusers表中的字段也和如何實體raduser和radcheck有關係嗎? – rubyprince

+0

@rubyprince對不起,不知道爲什麼我以前沒有看到你的評論。現在會這樣做。 –

回答

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

+0

謝謝,讓我通讀和生病回覆你 –

+0

如果我需要驗證字段的實際內容,如檢查日期? –

+0

@rubyprice - 我試圖驗證字段,但它根本不起作用。已經按照你的指示去信,並通過在線教程。任何建議如何我可以驗證attribute_name字段? –