2015-02-06 2 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. Но если я попытаюсь проверить его так же, как имя, ничего не произойдет. Форма отправляется с 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

Привет, Джефф, я обновил свой ответ ниже, чтобы задать второй вопрос о том, как получить форму для публикации параметра, вложенного в Пользователь. Если я успешно рассмотрел все ваши вопросы, пожалуйста, отметьте правильный ответ. –

ответ

3

Если вы хотите выполнить проверку модели, которая включает : слова, то вам нужно добавить слова в качестве виртуального атрибута в файл User.rb, чтобы модель имела к нему доступ. Вы можете сделать это, просто добавив следующую строку в файл User.rb:

attr_accessor :words 

Тогда ваша модель теперь может выполнять валидации на нем, таком как:

validates_presence_of :words 

Кроме того, необходимо убедиться, что: слова пары принадлежат: пользователю и рассылаются как params["user"]["words"]


Edit:

Чтобы получить форму выкладывает: слова параметра вложенных в: пользователе изменить форму ввода в:

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

или поскольку модель теперь пользователь имеет виртуальный атрибут: слова, которые вы можете установить свой вид: рельсы.

<%= f.text_field :words %> 


ссылка APIDock на attr_accessors: 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']'? Я добавил свой код просмотра. –

1

Попробуйте поставить значение в params[:user][:words] вместо params[:words] и добавить attr_accessor :words в вашей модели.

+0

Как я могу сделать это submit 'params ['user'] ['words']'? Я добавил свой код просмотра. –

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 метод инициализации. Кажется, что эта проверка должна произойти только в этом действии.

Правильный подход должен использовать объект формы. Вы можете узнать больше здесь: http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/