Ruby on Rails - 验证模型字段中的一些未定义

时间:2009-11-12 04:48:20

标签: ruby-on-rails

我的应用上有用户注册程序。但我的用户必须注册促销代码。 所以我有模型Promocodes:

  t.references :user #this is who have create that promo, e.g. Admin
  t.string :name #a "name" for promo, e.g. "some_promo"
  t.integer :allowreg #how much registrations  can be done using that promo key

所以现在,在注册时,我必须检查促销。但它怎么做呢?!这是我对注册表单的看法:

        <% form_for @user do |f| %>
            <%= f.error_messages %>
            <fieldset>
                <ol>
                  <li>
                    <%= f.label "Promo key" %>

                   ??????????????????????????????????
                                        There have to be a field for promo key
                                       ???????????????????????????????????


                  </li>
                    <li>
                        <%= f.label :login, 'Login' %>
                        <%= f.text_field :login %>
                    </li>
                    <li>
                        <%= f.label :email %>
                        <%= f.text_field :email %>
                    </li>
                    <li>
                        <%= f.label :password, "Pass" %>
                        <%= f.password_field :password %>
                    </li>
                    <li>
                        <%= f.label :password_confirmation, 'Pass again' %>
                        <%= f.password_field :password_confirmation %>
                    </li>
                </ol>
            </fieldset>
            <div class="buttons">
                <%= submit_tag 'Signup!' %>
            </div>
        <% end %>

谢谢!

5 个答案:

答案 0 :(得分:0)

看看fields_for - 我认为这应该会有所帮助。

答案 1 :(得分:0)

确定。这是解决方案:

使用

组合的用户模型
  attr_accessor :promocode

  attr_accessible: promocode

让你使用:promocode作为param。例如,您将可以访问@ user.promocode。

答案 2 :(得分:0)

如果您不想使用promocode属性删除用户模型,我认为您可以使用label_tag中的text_field_tag(以及相应的[form_for]) 。类似的东西:

<% form_for @user do |f| %>
  <%= f.error_messages %>

  <%= label_tag "promo_key" %>
  <%= text_field_tag "promo_key" %>

  <%= f.label :login, 'Login' %>
  <%= f.text_field :login %>

  <%# ...other fields go here... %>

  <%= f.submit 'Signup!' %>
<% end %>

然后,在您的控制器的创建操作中,您只需通过选中params[:promo_code]即可访问输入的促销代码。

def create  
  @user = User.new(params[:user]) #build up the user object 
  promo_code = PromoCodes.find_by_name(params[:promo_code]) #find the promo code that user entered

  if promo_code.allow_reg == 0 #make sure that the code has uses left
    flash[:notice] = "That promo code has expired. Whoops!"
    render :action => 'new'
  else

    if @user.save 
      #i assume you want to decrement the allow_reg on a successful registration?
      promo_code.update_attribute :allow_reg, promo_code.allow_reg - 1

      flash[:notice] = "User account created! Please log in with your new account"  
      redirect_to login_url  
    else  
      render :action => 'new'  #user couldn't be saved. validation error?
    end 

  end 
end

那还行吗? (我可能会考虑将promocode检查从创建操作中移除到之前的过滤器中,以保持清洁。)

-John

答案 3 :(得分:0)

这是您的新代码

在用户模型中添加    accepts_nested_attributes_for:promocode

                                                                                                                     
  •                                    ??????????????????????????????????                                         这是你的新代码                                        ???????????????????????????????????                                                                                                                    '12345'%&gt;                                     
                                  </li>
                                        <li>
                                                <%= f.label :login, 'Login' %>
                                                <%= f.text_field :login %>
                                        </li>
                                        <li>
                                                <%= f.label :email %>
                                                <%= f.text_field :email %>
                                        </li>
                                        <li>
                                                <%= f.label :password, "Pass" %>
                                                <%= f.password_field :password %>
                                        </li>
                                        <li>
                                                <%= f.label :password_confirmation, 'Pass again' %>
                                                <%= f.password_field :password_confirmation %>
                                        </li>
                                </ol>
                        </fieldset>
                        <div class="buttons">
                                <%= submit_tag 'Signup!' %>
                        </div>
                <% end %>
    
  • 答案 4 :(得分:0)

    在您的用户模型中:

    class User < ActiveRecord::Base
      has_one :promocode
      accepts_nested_attributes_for :promocode
    end
    

    然后在您的视图中,您可以使用:

    <% f.fields_for :promocode do |promocode_form| %>
      <% promocode_form.text_field :code_key %>
    <% end %>
    

    在您的促销代码模型中,您可以编写您想要的任何验证(可能通过cusomt使用def验证方法),当您的用户控制器操作'create'尝试保存用户对象时,它还将保存/验证promocode,find在这里了解更多信息:

    http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html