0

私は RoR アプリケーションを持っており、足場の生成により、モデルの新しいアクションと編集アクションが得られました。ビューには、_form.html.erb があります。このフォームには、たまたま attr_accessible である 2 つのフィールドへの入力がありますがcreated_atupdated_atや などのフィールドへの入力はありませんid

すべてのモデルに対してカスタムの他のフォームとビューを生成したいと考えています。手動で設定する必要があるフィールドをプログラムで見つける方法と、Rails によって設定されるフィールドを知りたいです。モデルウィジェットがある場合、Widget.columns はすべてのフィールドを提供します。

Rails の scaffold 生成は、フォームに入力するフィールドをどのように認識しますか。また、「created_at」と「updated_at」の設定方法を決定するコードはありますか? それとも、これはDBによって行われますか?

更新:明確にするために、具体的にやりたいこと:

  1. 多数の行/エンティティをアップロードするためのフォームを生成しています。そのため、フォームに含めるフィールドを知る必要があります。フィールドは常にWidget.accessible_atributes手動で設定されますか?

  2. 自動的に含めるフィールドを知る必要があります。モデルの新しいメソッドを使用するとcreated_atupdated_at、 、idが自動的に設定されます。テーブルに数千行をロードしたいのですが、SQLロードファイルコマンドのようなことをします.created_atとupdated_atを設定する必要がありますが、idは設定しないでください. 設定するフィールドを知るにはどうすればよいですか。私はいくつかの仮説的な方法を探しています

    >> Widget.auto_columns
    # returns {:created_at => '04/12/2013 9:29pm', :updated_at => '04/12/2013'}
    

更新 2 :スキャフォールディングがどのように行われるかを確認しようとしています。フォームで表示します。

<% attributes.each do |attribute| -%>
  <div class="field">
    <%%= f.label :<%= attribute.name %> %><br />
    <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
  </div>
<% end -%>
  <div class="actions">
    <%%= f.submit %>
  </div>
<%% end %>

トールの引数メソッドでscaffold_generator.rbに属性配列が生成されていると思います。

4

1 に答える 1

1

Rails の scaffold 生成は、フォームに入力するフィールドをどのように認識しますか。

足場を生成するときは、次のように生成します::

rails generate scaffold TableName attribute:type_of_attribute attribute2:type_of_attribute

また、必要な数の属性を連結できます。

また、「created_at」と「updated_at」の設定方法を決定するコードはありますか? それとも、これはDBによって行われますか?

タイムスタンプ ( created_atupdated_at) およびidは、Rails によって自動的に設定されます。

それらは常にデータベースに追加されます (移行ファイルのタイムスタンプを手動で削除したい場合を除きますが、id常に残ります)。

また、自動的に生成されるモデル (テーブル) にいくつかのフィールドを設定することもできますが、そのためのコードを記述する必要があります。

アクセス可能な属性について、使用方法はわかりませんが:

Photo.accessible_attributes.each { | attribute | puts attribute if attribute.length > 0 }

何らかの理由で最初の値 "" が表示されるので、そのようにエスケープしました。また、属性とアクセシビリティ、カウント列の詳細:

Rails モデルの列名を取得する

モデル インスタンスからアクセス可能な属性名を見つけるにはどうすればよいですか?

于 2013-03-12T22:14:21.207 に答える