2013-09-04 5 views
0

Как я могу сохранить значение select_day после ошибки проверки? Я могу установить значение по умолчанию для него, как это:select_day/year/month preset value

f.select_day 1, {prefix: 'user[birthdate]'} 

Но я не могу сделать так, чтобы установить значение от модели:

f.select_day :birthdate, {prefix: 'user[birthdate]'} 

ошибка:

ActionView::Template::Error (undefined method `day' for :birthdate:Symbol) 

Возможно ли, или мне нужно получить и установить значение из параметров вручную?
модель:

class User 
    include ActiveModel::Model 
    include ActiveRecord::AttributeAssignment 
    attr_accessor :birthdate 
    def self.build(request, params = {}) 
    u = self.new 
    u.assign_attributes(params) 
    u 
    end 
end 

контроллер:

def new 
    @user = User.new 
end 

def create 
    @user = User.build(params[:user]) 
end 

вид:

= form_for @user do |f| 
    f.select_day 1, {prefix: 'user[birthdate]'} 
    f.select_month 1, {prefix: 'user[birthdate]'} 
    f.select_year 1990, {prefix: 'user[birthdate]'} 
+0

http://stackoverflow.com/questions/2916995/keep-form-fields-filled-after-an-error-ror –

+0

@HasanIqbalAnik Это не работает, как я уже говорил. – freemanoid

+0

@freemanoid Посмотрите на свою ошибку. Select_day ожидает дату ([docs] (http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-select_day)). Я предполагаю, что число хранится в этом месте. Можешь подтвердить? – screenmutt

ответ

2

Если вы отметите в документацию для select_day (и _month и _year) вы увидите, что методы обычно принимают дату их первое параметр.Они также принимают целое число, которое вы выбрали, но это явно альтернативная реализация.

Как бы то ни было, я бы предложил пару небольших изменений. Во-первых, я настоятельно рекомендую установить дату рождения по умолчанию для класса User в этих строках.

class User 
    attr_accessor :birthdate 

    def initialize() 
    @birthdate = Date.new 1990, 1, 1 
    super 
    end 

    ... 
end 

Тогда ваши формы могут использовать Access # для определения даты рождения как в новых, так и в редактируемых представлениях.

= form_for @user do |f| 
    = f.select_day @user.birthdate, prefix: 'user[birthdate]' 
    = f.select_month @user.birthdate, prefix: 'user[birthdate]' 
    = f.select_year @user.birthdate, prefix: 'user[birthdate]' 
-1

Может быть, вы можете попробовать сделать:

= f.select_day f.object.birthday, {prefix: 'user[birthdate]'} 
+0

Вы пробовали? – freemanoid

+0

на самом деле нет ... да ... теперь я вижу ошибку ... но главное сообщение было о «f.object.birthday» .... потому что я не вижу разницы между моим кодом и вашим f.select_day 1, {prefix: 'user [birthdate]'} ... это то же самое. –

1

Подход 1 (Хакки):

Что вы спрашиваете - это назначение нескольких параметров, которое выполняется assign_multiparameter_attributes.

Измените свою форму, чтобы она выглядела примерно.

= select_day @user.birthdate, prefix: "user", field_name: "birthdate(3i)" 
= select_month @user.birthdate, prefix: "user", field_name: "birthdate(2i)" 
= select_year @user.birthdate, prefix: "user", field_name: "birthdate(1i)" 

assign_multiparameter_attributes ожидает, что тип столбца, чтобы быть известным, чтобы установить значение. Для того, чтобы работать, вы должны иметь метод, называемый column_for_attribute(name)

attr_accessor :birthdate 

def column_for_attribute(name) 
    return ActiveRecord::ConnectionAdapters::Column.new(:birthdate, nil, "date") if name.to_sym == :birthdate 
end 

Поэтому с помощью ActiveRecord модулей без БД является плохой идеей.

подход 2 (Enhance ActiveModel):

Посмотрите this. Он пытается создать BaseModel, который обрабатывает назначение дат.

подход 3 (пользовательский код):

Если вы не хотите использовать драгоценный камень, то путь будет ввести три атрибута (day, month, year) в User и есть метод, называемый birthdate, который создает Date объекта из эти три.

Если у вас есть аналогичные требования во многих местах, я бы предложил усилить ActiveModel (подход 2). Но если вы имеете это требование только в одном месте пойти с подходом 3.

0

Вы пытались использовать полный выбор select_datetime вариант? Это автоматически сгенерирует все поля, необходимые для подключения даты.

Вы также можете использовать что-то вроде JQueryUI datepicker, которое позволит вам использовать обычное текстовое поле и предоставить небольшое небольшое всплывающее окно для выбора даты, а также позволяет пользователю вводить дату, если захочет.

Смежные вопросы