Если вы не хотите портить вашу пользовательскую модель атрибутом promocode, я думаю, вы можете использовать text_field_tag
(и соответствующий [label_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
Это тоже сработает? (Я бы, вероятно, подумал о том, чтобы перенести проверку промокода из действия create в фильтр before, чтобы сохранить чистоту.)
-John