簡體   English   中英

如何驗證不與db列對應的參數?

[英]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 %>


attr_accessors上的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

該表單應提交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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM