2015-02-06 42 views
0

我有一個模型User,字符串屬性爲name。在我的表單創建一個新的User,很容易驗證name屬性:我怎樣才能驗證那些不會腐蝕db列的參數?

型號/ user.rb

validates :name, presence: true, length: {maximum: 13} 

users_controller.rb

private 

def user_params 
    params.require(:user).permit(:name, :words) 
end 

然而,我想要驗證一個參數不是屬性或db列。在我的表單中,我有一個以字符串形式提交params["words"]的文本框。我知道該參數正在提交,因爲我可以使用binding.pry與它進行交互。但是,如果我嘗試以與Name相同的方式驗證它,則什麼都不會發生。表格提交有或沒有words。我如何驗證不是屬性的參數?

我的表格:

<%= form_for @user, :url => users_path do |f| %> 
    <%= f.text_field :name %> 
    <input id="words" name="words"> 
    <%= f.submit "Submit", class: "btn" %> 
<% end %> 
+0

喜傑夫,我更新我的回答如下,以解決第二個問題,關於如何讓你的形式張貼在用戶嵌套的參數。如果我已成功解決了所有問題,請將答案標記爲正確。 – 2015-02-07 20:32:05

回答

3

如果要執行模型驗證,其中包括:單詞,則需要在User.rb文件中將單詞添加爲虛擬屬性,以便模型可以訪問它。你可以做到這一點只需添加這行到你的User.rb文件:

validates_presence_of :words 

你還需要確保:

attr_accessor :words 

那麼你的模型就可以了,如現在執行驗證:話參數所屬於:用戶,正在發送作爲params["user"]["words"]


編輯:

爲了讓您的形式張貼:話嵌套在參數:用戶表單輸入更改爲:

<input id="words" name="user[words]"> 

因爲用戶模型現在擁有的虛擬屬性:也就是說,你可以設置你的形式軌道方式。在attr_accessors

<%= f.text_field :words %> 


APIDock參考: http://apidock.com/ruby/Module/attr_accessor

虛擬屬性參考: http://www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Ruby_Classes_Objects_and_Variables_Virtual_Attributes.html

1

形式應提交params['user']['words']而不是params['words'],和您的用戶模型應該有attr_accessor :words

+0

我該如何提交'params ['user'] ['words']'?我添加了我的視圖代碼。 – 2015-02-06 15:46:02

1

嘗試把你的價值在params[:user][:words]代替params[:words]並添加到模型attr_accessor :words

+0

如何讓它提交'params ['user'] ['words']'?我添加了我的視圖代碼。 – 2015-02-06 15:46:46

0

您可以將words屬性添加到User類。

class User < ActiveRecord::Base 
    attr_accessor :words 

    validates :words, presence: true, length: {maximum: 13} 

    def initialize(arguments = {}, options = {}) 
    self.words = arguments.delete :words 
    super 
    end 
end 

但是,覆蓋ActiveRecord不建議使用初始化方法。看來這個驗證應該只發生在這個動作中。

正確的方法應該使用Form對象。你可以在這裏瞭解更多:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/