простая форма и форма объекта - одна форма для нового и редактирования - PullRequest
0 голосов
/ 15 мая 2018

Я пытался найти ответ на следующий вопрос, но мне не удалось.

Я создаю simple_form с помощью Form Object, и я не знаю, какой URL следует указывать в simple_form, чтобы повторно использовать эту форму для новых действий и действий по обновлению.

Вот мой код: ArticlesController:

class ArticlesController < ApplicationController

...

  def new
    @article = Article.new
    @article_form = ArticleForm.new(@article)
  end

  def create
    @article = Article.new
    @article_form = ArticleForm.new(@article)
    if @article_form.save(article_params)
      flash[:notice] = 'You have added a new article.'
      redirect_to @article_form.article
    else
      flash[:danger] = 'Failed to add new article.'
      render :new
    end
  end

  def edit
    @article = Article.find(params[:id])
    @article_form = ArticleForm.new(@article)
    # binding.pry
  end

  def update
    @article = Article.find(params[:id])
    @article_form = ArticleForm.new(@article)
    if @article_form.save(article_params)
      flash[:success] = 'Article updated'
      TagServices::OrphanTagDestroyer.call
      redirect_to @article_form.article
    else
      flash[:error] = 'Failed to update the article'
      render :edit
    end
  end
end

Форма для отображения в новых / редактируемых действиях:

= simple_form_for @article_form, url: article_path do |f|
  = f.input :title, label: "Article title:"
  = f.input :body, label: "Body of the article:", as: :text, input_html: { :style => 'height: 200px' }
  = f.input :tags_string, label: "Tags:", input_html: { value: f.object.all_tags }
  = f.button :submit, 'Send!'

ArticleForm:

class ArticleForm
  include ActiveModel::Model
  delegate :title, :body, :author_id, :tags, :id, :persisted?, to: :article
  attr_accessor :article
  validates_presence_of :title, :body, :tags
  validate :validate_prohibited_words

  def initialize(article)
    @article = article
  end

  def save(article_params)
    @article.update_attributes(article_params.slice('title', 'body', 'author_id'))
    @article.tags = tag_list(article_params[:tags_string])

    if valid?
      @article.save!
      true
    else
      false
    end
  end

  def tag_list(tags_string)
    tags_string.scan(/\w+/)
               .map(&:downcase)
               .uniq
               .map { |name| Tag.find_or_create_by(name: name) }
  end

  def all_tags
    return tags.collect(&:name).join(', ') if tags.present?
    ''
  end
end

Конечно, я указал маршруты для статьи:

  resources :articles

Когда я указываю URL с помощью "article_path", я не могу использовать действие "new" (идентификатор не указан), когда я ставлю "article", я не могу исправить (не найден aciton). Я читал о создании URL-адреса и метода на основе того, является ли запись новой или была создана ранее, я также думал о рендеринге частичных данных ... но я не совсем уверен, что это правильные шаги.

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете проверить, является ли ваш объект новой записью, поэтому вы можете указать разные URL для новой формы или формы редактирования, например:

= simple_form_for @article_form, 
url: (@article_form.new_record? ? your_path_for_new_record : your_path_for_edit) 
do |f|

Надеюсь, это поможет. Удачи!

...