«Def create» вручную рельсы - PullRequest
0 голосов
/ 10 января 2012

Есть ли способ вручную выполнить функцию "создать"? У меня есть эшафот (модель / контроллер / вид), поэтому я хочу немного изменить параметры, которые мне дал пользователь.

 def create

  @meme = Meme.new(params[:meme])

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

Есть ли способ сделать что-то вроде:

def create

  @meme = Meme.new
  @meme.name = params([:name])
  @meme.id = params([:id])
  @meme.url = @meme.name+@meme.id 




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

Итак, как вы можете видеть в последнем примере, я хочу сохранить URL-адрес, объединяющий имя и идентификатор, Есть ли способ добиться этого от контроллера.

Заранее спасибо.

1 Ответ

2 голосов
/ 10 января 2012

Код, который вы ищете, представляет собой комбинацию обоих ваших примеров:

def create

  @meme = Meme.new(params[:meme])
  @meme.url = "#{@meme.name}-#{@meme.id}" 

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

Я вставил тире между именем и идентификатором только для ударов.

Вы также можете подумать о том, чтобы сделать это в before_save хуке внутри модели Meme, это было бы более чистым решением, чем наличие его в контроллере. Удачи!

...