Проверка полей, которых нет в модели / контроллере в Rails - PullRequest
0 голосов
/ 08 марта 2012

Я относительный новичок в Rails, поэтому прости меня, если мой вопрос получил очевидный ответ.

Я пытаюсь включить поле в форму Rails, которого нет в модели / контроллереили миграция, связанная с представлением.

Форма является простой формой общедоступного контакта, и я могу достаточно легко проверить большинство полей.Например, имя, адрес электронной почты и т. Д.

Модель form_submission.rb

Однако у меня есть поле в контактной форме - captcha - которое не отражено в таблице db form_submissions и т. Д.

Для капчи имеется отдельная таблица, модель и т. Д. Captcha_answer.rb (и т. Д.)

Атрибуты для captcha_answer в миграции: answer и is_correct.

Таблица simple содержит список ответов на заранее заданный вопрос, некоторые из которых являются правдой, а некоторые ложными.

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

Что это за животное?

С опциями: кошка, собака, дерево, кролик .. в выборе.

Что я хочу сделать, это проверить, что:

a) Поле PAPTCHA существует в POST (если нет, возвращаемое сообщение «не указано CAPTCHA». Б) Данный ответ имеет значение в captcha_answers.is_correct of true (если нет, возвращаемое сообщение «Вы дали неправильный ответ»)

capcha_answers.answer всегдапоэтому я хочу сделать эквивалент SQL-запроса, который получает первую запись, где captcha_answers.answer = и возвращает значение captcha_answers.is_correct

Как я уже сказал, если атрибут был в form_submissions, то я 'Я смог бы проверить это без проблем, но я не могу понять, как я могу проверить поле по чему-то в другой модели.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Вы можете просто добавить, например, скрытое поле и перехватить его в контроллере:

в вашей форме:

<%= hidden_field(:signup, :pass_confirm, :value => 'abcd') %>

затем в контроллере:

params[:signup]

Там вы можете получить доступ к другой модели и подтвердить ответ.

Действие в контроллере:

def update
    @company = Company.find(params[:id])

    puts "extra field:" 
    puts params[:signup]

    respond_to do |format|
      if @company.update_attributes(params[:company])
        format.html { redirect_to @company, :notice => 'Company was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render :action => "edit" }
        format.json { render :json => @company.errors, :status => :unprocessable_entity }
      end
    end
  end
1 голос
/ 08 марта 2012

Определите методы доступа для дополнительного поля и используйте обычные проверки ActiveRecord:

class MyModel < ActiveRecord::Base
  attr_accessor :extra_field

  validates :extra_field, :presence => true

  validate :custom_validation_method

  def custom_validation_method
    errors.add :extra_field, :invalid unless extra_field == "correct"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...