1

これはおそらく非常に不適切な質問でしたが、[編集] をクリックしたときにフォーム データを取り込む方法を Rails がどのように認識しているかに興味があります。たとえば、Post というモデルをスキャフォールディングし、その Post のタイトルとコンテンツを入力した場合、後で編集すると、フォームは自動的に入力されます。

コントローラーとフォームのパーシャルを見ましたが、既存のデータで埋めるように指示するものは何も含まれていないようです。

私がこれを尋ねている理由は、ユーザーが他の人の投稿を自分のフォームに「インポート」して編集できるようにしたいからです。どうすればいいですか?

4

2 に答える 2

4

質問の最初の部分に答えるには、モデルを編集するためのリンクを確認することから始めます。インデックスビューファイル(app/views/posts/index.html.erb)では、次のようになります。

<%= link_to 'Edit', edit_post_path(post) %>

ブラウザでインデックスページを開くと、次のようなリンクが作成されます。

http://*servername*/post/*id*/edit

リソースルーティングは、これがのeditアクションを呼び出すことpost_controller、およびid値がURLにあることを認識しています。

次に、 ()のeditアクションを見てください。次のようになります。post_controllerapp/controllers/posts_controller.rb

def edit
  @post = Post.find(params[:id])
end

idこれは、URLを介して渡された値を使用して、その値をPost含むデータベースでを検索しid、それを変数に保存するだけです@post。編集ビューファイル(app/views/posts/edit.html.erb)のコードを見ると、ほとんどの場合、フォーム部分(/app/views/posts/_form.html.erb)が使用されており、そのファイルには、ブラウザに表示される実際のフォームをレンダリングするためのコードが含まれています。

<%= form_for(@post) do |f| %>

この行は@post、アクションで設定された変数を使用してフォームの作成を開始しますPostsController edit。このコードのブロック内には、次のようなものがあります-

<div class="field">
  <%= f.label :title %>
  <%= f.text_field :title %>
</div>

:titleこのコードは、-のプロパティに関連付けられた形式でテキストフィールドを構築します@post。そのプロパティに値が存在する場合、text_fieldメソッドはテキストフィールドにその値を入力することを認識しています。

2番目の部分(「ユーザーが他のユーザーの投稿をフォームに「インポート」して編集できるようにしたい」)は、はるかに制限がなく、アプリで実際に何をしたいかに依存します。すべてのユーザーが他のすべてのユーザーの投稿を表示して直接編集します(Wikiのようなものですが、破壊的な編集が含まれます)。または、投稿を作成したユーザーだけが編集可能で、他のユーザーは表示できるようにしてから、ユーザーが別のユーザーの投稿のコンテンツを現在のユーザーが所有する新しい投稿にコピーできるようにするコントローラーアクションを作成できます。または他のもの-それは本当にあなたが望むものに依存します。

于 2012-05-18T12:09:44.713 に答える
2

編集の場合、コントローラーは編集するアイテムの ID を持つオブジェクトを取得します。item はビューで使用できるインスタンス変数であり、ビューで使用されるフォーム ヘルパーは、HTML フィールドにそれらの内部に表示される値を与える HTML を生成します。Rails Form Helper の魔法は言うまでもありません! <input value="<%= @post.title %>(プレーンな HTML を記述した場合、「これは、使用時に Rails ヘルパーが自動的に実行することと同じくらい簡単です。 f.text_field :title)

他の人の投稿をインポートすることは一種のビジネス ロジックであり、アプリケーションがどのように実装されるかはわかりません。しかし、ユーザーが投稿の編集リンクをクリックすると、入力されたビューで、フォームに既に入力されている既存の値が表示されます。

于 2012-05-18T11:51:49.967 に答える