Ruby on Rails - проверьте некоторые неопределенные в поле модели - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть процедура регистрации пользователей в моем приложении. Но мои пользователи должны зарегистрироваться с промо-кодом. Для этого у меня есть промокоды модели:

  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 голосов
/ 12 ноября 2009

в вашей модели пользователя:

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 use def validate), когда действие пользовательского контроллера 'create' пытается сохранить объект пользователя, оно также сохранит / подтвердит промокод, найдите Подробнее об этом здесь:

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

0 голосов
/ 12 ноября 2009

Вот твой новый код

ДОБАВИТЬ в МОДЕЛЬ ПОЛЬЗОВАТЕЛЯ accepts_nested_attributes_for: promocode

?????????????????????????????????? Вот твой новый код ??????????????????????????????????? '12345'%>
                              </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 голосов
/ 12 ноября 2009

Хорошо. вот решение:

В модели пользователя используется комбинация

  attr_accessor :promocode

и

  attr_accessible: promocode

позволяет использовать: промокод в качестве параметра. И вы получите доступ к @ user.promocode, например.

0 голосов
/ 12 ноября 2009

Если вы не хотите портить вашу пользовательскую модель атрибутом 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

0 голосов
/ 12 ноября 2009

Взгляните на fields_for - думаю, это должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...