我的应用上有用户注册程序。但我的用户必须注册促销代码。 所以我有模型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 %>
谢谢!
答案 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
</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