如何在Ruby on Rails中不是模型的一部分时验证text_field_tag?

时间:2016-01-12 02:53:22

标签: ruby-on-rails

我正在创建一个婚礼rsvp应用程序并遇到了问题。我有一个带有一些字段的RSVP模型然后在我的表单中我添加了一个不属于RSVP模型的额外文本字段(text_field_tag),但我想在我的rsvp.rb模型中验证它使它成为必需品。

额外字段是"代码"我将在婚礼邀请函中提供的字段(如下所示)。

我也希望"比较"输入的"代码"在我的控制器rsvp_controller.rb中创建rsvp时的有效静态代码。

new.html.erb

<%= form_for(@rsvp, :html => { class: 'form-horizontal', role: 'form' }) do |r| %>

<div class="form-group">
  <div class="control-label pull-left">
    <%= r.label :party, 'Name' %> <span class="required">*</span>
  </div>
  <div class="control-label">
    <%= r.text_field :party, class: 'form-control', placeholder: 'Individual or family name', autofocus: true %>
  </div>
</div>
...
<div class="form-group">
  <div class="control-label pull-left">
    <label for="rsvp_code">Enter code found in invitation</label> <span class="required">*</span>
  </div>
  <div class="control-label">
    <%= text_field_tag 'rsvp_code', nil, class: 'form-control' %>
  </div>
</div>
...

<% end %>

rsvp_controller.rb

def create
  @rsvp = Rsvp.new(rsvp_params)

  #compare the values of the text field to invitation code
  #if values match then proceed
  #else send error message

  if @rsvp.save
    flash[:success] = 'Thank you'
    redirect_to root_path
  else
    render 'new'
  end
end

rsvp.rb

class Rsvp < ActiveRecord::Base
  validates text_field_tag presence: true #or something like this
end

2 个答案:

答案 0 :(得分:3)

此处的其他答案将有效。但他们非常混乱。验证属于模型。

class Rsvp < ActiveRecord::Base
  attr_accessor :rsvp_code
  validates :rsvp_code, presence: true
end

您还需要将表单从<%= text_field_tag 'rsvp_code', nil, class: 'form-control' %>更改为<%= f.text_field :rsvp_code, class: 'form-control' %>

详细了解attr_accessor

答案 1 :(得分:0)

由于该值未存储在模型中,因此在那里验证它没有意义。而是在控制器中添加此逻辑。根据您存储“静态代码”的方式,您的控制器逻辑应如下所示:

def create
  if params["rsvp_code"] == "YOUR_CODE"
    Rsvp.new(rsvp_params)
    ...
  else
   flash["error"] = 'Your invitation code does\'t match'
   redirect_to rsvp_new_path
  end
end