1

ActiveAdminをインストールして、次のようなフォームを作成しました。

form do |f|
  f.inputs "Details" do
    f.input :title
    f.input :published_on, as: :datepicker
  end
  f.has_many :images do |images_f|
    images_f.input :image, as: :file, hint: images_f.template.image_tag(images_f.object.image.url)
    images_f.input :description, as: :text, input_html: { rows: 3 }
  end
  f.has_many :topics do |t_f|
    t_f.input :maker
    t_f.input :title
    t_f.input :text
    t_f.input :image, as: :file, hint: t_f.template.image_tag(t_f.object.image.url)
    t_f.input :sort_order
  end
  f.buttons
end

かなりの数の必須の感触を得たので、has_many:images内の画像を選択し、[保存]をクリックすると(検証に失敗することがわかっています)、ヒントで選択した画像が表示されます。ただし、画像入力は引き続き表示されます。フォームに入力せずにもう一度[送信]をクリックすると、検証に失敗しますが、今回は画像が表示されなくなります。

誰かがこれを防ぐ方法を知っていますか?ちょっと面倒です。

4

1 に答える 1

2

それを行うための標準的な方法はありません。HTMLファイル選択コントロールは、Railsやその他のフレームワークでは常に最初は空白であり、これはほとんどのブラウザーでも適用されます。だからそれはactiveadminの問題ではないと思います。これは、Webページで、ユーザーから選択を非表示にすることで、任意のファイルをアップロードできるためです。
カスタムオプションの1つは、アップロードされたファイルの非表示フィールドを使用し、検証が失敗した場合にそれらを追加することです。したがって、検証を開始する前に、ファイルを任意の場所(tmpディレクトリまたはsomethong)に保存し、それらへのリンクをモデルの仮想属性に保存する必要があります。その後、サーバーにアップロード済みのファイルへのリンクを含む非表示フィールドをフォームにレンダリングする必要があります。また、ファイル入力の場合は、それらへのリンクを表示して、それらを削除することもできます。

別のオプションは、モデルがすでにdbに保存されている場合に、他のフォームからajaxを使用してファイルをアップロードすることです。

モデルにファイルを必須にする場合は、モデルを無効としてマークするか、現在のモデルのコピーであるある種の一時モデルを使用できます。ファイルがアップロードされてモデルが有効になった後、選択に応じて、状態を有効に変更するか、一時インスタンスを別のデータベーステーブルにコピーできます。

于 2012-10-17T08:22:42.003 に答える