2017-02-06 2 views
1

У меня есть модель, как это:Как избежать создания некоторого атрибута в методе создания контроллера?

class Url < ApplicationRecord 
    validates ... 
    before_create :generate_number 

    def generate_number 
    self.number = a random value 
    end 
end 

и метод create() в контроллере:

def create 
    @url = Url.new(url_params) 

    respond_to do |format| 
    if @url.save 
     format.html { redirect_to @url, notice: 'Url was successfully created.' } 
     format.json { render :show, status: :created, location: @url } 
    else 
     format.html { render :new } 
     format.json { render json: @url.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Моя БД имеет только два поля: given_url и number. Теперь, когда я перехожу на страницу new, есть 2 формы ввода для given_url и number. Но я хочу, чтобы number принимал значение от generate_number, а не от формы. Как я могу это сделать?

Или, более конкретно, есть способ сделать способ generate_number переопределить вход пользователя после того, как приложение уже получает значение от входа пользователя?

+1

Сначала вы можете удалить входные данные из формы, если вас не интересует вход пользователя. Затем вам нужно удалить поле из белого списка сильных параметров. Но на самом деле: поскольку 'generate_number' всегда вызывается перед созданием, он все равно будет переопределять вход пользователя. – Wukerplank

+0

Есть ли способ заставить метод generate_number переопределять ввод пользователя после того, как приложение уже получает значение от входа пользователя? –

+0

вы можете использовать 'after_create' для этого. каждый раз, когда вы отправляете форму, пользовательский ввод переопределяет ваше случайное значение 'generate number' –

ответ

1

Вы можете просто ограничить вход от пользователя с помощью сильного Params

def url_params 
    params.require(:url).permit(:other, :params) 
end 
1

Ну, я нашел способ исправить это. Как @ts упоминался в комментарии на вопрос, я изменил before_create :generate_number к after_create :generate_number и добавилself.save к концу generate_number метода:

def generate_number 
    ... 
    self.number = some number 
    self.save 
end 
+1

haha ​​Мне не хватало 'self.save' @Huy vo –

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