2013-06-01 3 views
0

Рубиновые хэши великолепны, а Ruby с DataMapper еще больше ... Это касается создания экземпляра свойства DateTime в Ruby с использованием хэшей. Он связан с DataMapper.Ruby - DataMapper - Form - Create New - формат HTML для заполнения объекта DateTime в классе модели

У меня есть модальное, User, что есть день рождения, который хранится в DateTime

class User 
    include DataMapper::Resource 

    property :id, Serial 

    # Some other properties 

    property :date_of_birth, DateTime 

    property :gender, Enum[:male, :female, :other], { 
    default: :other, 
    } 

    property :children, Integer 
end 

Для заполнения формы я использую некоторые вещи, как это с HTML

<form method="post"> 

    <input type="text" name="user[name]" id="user-name"> 

    <!-- other fields --> 

    <select name="{what to use for year?}" id="user-birth-year> 
    <option value="1980">1980</option> 
    <!-- other options --> 
    </select> 

    <select name="{what to use for month?}" id="user-birth-month> 
    <option value="1">January</option> 
    <!-- other options --> 
    </select> 

    <!-- Other fields --> 
</form> 

В register.rb (маршрут) Я делаю что-то вроде этого ...

post '/auth/register' do 
    user = User.new(params['user']) 
    # Other stuff 
    end 

Как я понимаю, пользователь должен быть похож на свои поля. Итак, как было бы названо поле date_of_birth для достижения этого.

Мое предположение заключалось в том, чтобы использовать что-то вроде этого, но, похоже, оно не работает.

:date_of_birth = { 
    :year => '2010' 
    :month => '11' 
    :date => '20' 
} 

Какой будет дано по имени user[data_of_birth][year]user[date_of_birth][month] и user[date_of_birth][date] для избранных списков.

ответ

1

Массовое назначение (User.new(params['user'])) не очень хорошая практика. В любом случае, вам нужно как-то получить объект DateTime или Time. Вы можете назвать поля, как вы хотите, например:

<select name="user[date_of_birth][year]" id="user-date_of_birth-year> 
    <option value="1980">1980</option> 
    <!-- other options --> 
</select> 

<select name="user[date_of_birth][month]" id="user-date_of_birth-month> 
    <option value="1">January</option> 
    <!-- other options --> 
</select> 

<select name="user[date_of_birth][day]" id="user-date_of_birth-day> 
    <option value="1">1</option> 
    <!-- other options --> 
</select> 

и в контроллере:

dob = DateTime.new(
    params['user'][date_of_birth][year].to_i, 
    params['user'][date_of_birth][month].to_i, 
    params['user'][date_of_birth][day].to_i 
) 
User.new(:name => params['user']['name'], :date_of_birth => dob, ...) 
+0

Спасибо за информацию, я хотел бы знать, почему это может быть плохо. Это похоже на то, что пользователь будет публиковать данные, которые не в форме, манипулируют системой, отличной от желаемого поведения (тупой пример: как получить премиальный аккаунт без оплаты). Он должен работать, я буду тестировать и принимать его завтра утром. –

+1

Именно по этой причине. Удачи с вашим проектом! –