![](/img/trans.png)
[英]RSpec controller test can't get id params. I don't know how to fix this
[英]How can I validate params that don't corrospond to a db column?
我有一個模型User
,其字符串屬性為name
。 在我的表單上創建一個新的User
,很容易驗證name
屬性:
車型/ user.rb
validates :name, presence: true, length: {maximum: 13}
users_controller.rb
private
def user_params
params.require(:user).permit(:name, :words)
end
但是,我想驗證不是屬性或數據庫列的參數。 在我的表單上,我有一個文本框,它以字符串形式提交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 %>
如果要執行包含:words的模型驗證,則需要在User.rb文件中添加:words作為虛擬屬性,以便模型可以訪問它。 您只需將以下行添加到User.rb文件中即可:
attr_accessor :words
然后,您的模型現在可以對其執行驗證,例如:
validates_presence_of :words
您還需要確保:words參數屬於:user並作為params["user"]["words"]
編輯:
要使您的表單發布嵌套在:user下的:words參數,請將表單輸入更改為:
<input id="words" name="user[words]">
或因為用戶模型現在具有虛擬屬性:words,所以您可以將表單設置為rails方式。
<%= f.text_field :words %>
虛擬屬性參考: http : //www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Ruby_Classes_Objects_and_Variables_Virtual_Attributes.html
該表單應提交params['user']['words']
而不是params['words']
,並且您的User模型應具有attr_accessor :words
。
嘗試將您的值放在params[:user][:words]
而不是params[:words]
然后在模型中添加attr_accessor :words
。
您可以將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
初始化方法。 似乎此驗證僅應在此操作中進行。
正確的方法應該使用表單對象。 您可以在此處了解更多信息: http : //blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.