2017-03-23 2 views
1

私はRuby on Railsを学んでいます。私は、Railsアプリケーションを介してクライアントからサーバーへの情報転送を概念的かつ具体的に追跡し、応答としてクライアントに返すことにしました。ルートとアクションに対するリクエストの関係

私がフォローしているのは投稿コントローラと新しいアクションをルーティングする「新しい投稿」リンクをクリックすることです。これは新しいアクションの内容です:@post = current_user.posts.build。私の考えは、メモリ(.build)内のオブジェクトを作成し、ポストテーブルをcurrent_user(Deviseから)に接続します。現在のユーザは、モデルを通って来るユーザテーブルからのデータです。このオブジェクトは@post変数に割り当てられています。

current_userと投稿の関係は100%明確ではありませんが、投稿はcurrent_userに含まれているようです。概念的にこれを見るための良い方法はありますか?

この@postオブジェクトは、新しいビューとともにクライアントに送信されます。新しいビューでは、これは次のとおりです。

<%= simple_form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %> 
<div class="form-group"> 
    <%= f.input :image %> 
</div> 
<div class="form-group text-center"> 
    <%= f.input :caption %> 
</div> 
<div class="form-group text-center"> 
    <%= f.button :submit, class: 'btn-success' %> 
</div> 
<% end %> 

私はここで何が起こっているか完全に理解していません。私は@post変数がこのループに組み込まれていると思うし、これらの入力はそれぞれイメージとキャプションの列に入れられ、infoは他の列に入れられます。これは、@postオブジェクトに投稿テーブルの列が含まれているために可能です。私はここで何が起こるか考えて正しいですか?

このオブジェクトのイメージとキャプションで、クライアントはsubmitを押して別の要求を開始します。このリクエストはPOSTメソッドを使用するため、投稿コントローラと作成アクションにルーティングされます。これは、作成アクションの最初の行です:@post = current_user.posts.build(post_params)

これは私の理解が崩壊し始めるところです。私はどのように@post画像とその "内側"のキャプションを持つオブジェクトが作成アクションを入力するか分からない。ルートはそれを直接作成アクションに送りますか?これは、作成アクションに引数がない理由ですか?少なくとも鉱山はそうではなく、行動が議論を引き取ることができるかどうかはわかりません。彼らはできますか??

@postオブジェクトで発生している画像、キャプションなどのデータは、いったん作成アクション内に入れられますか?それは内部にあるものに置き換えられますcurrent_user.posts.build(post_params)?実際にはcurrent_user.posts.build(post_params)の内部には何がありますか?このcurrent_user.posts.build@postオブジェクトはcurrent_user.posts.build(post_params)の代わりになりますか?私はこの方法がcurrent_user.posts.buildポスト表中の質量移行のための画像とキャプション列をホワイトリストされて作っていると思い

def post_params 
    params.require(:post).permit(:image, :caption) 
end 

構築するために送られたpost_params引数は、この方法です。

私がこれをより明確に理解するのを助けることができる誰かに事前に感謝します! CURRENT_USERと支柱の間

答えて

1

関係、 あなたはuser.rbモデルを開く場合は、ユーザーが多くの記事があり、user.postsを行うことができます理由ですhas_manyの関連

has_many :posts 

が表示されます。ビルド

<%= simple_form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %> 

これはループではありません。そのブロック。ブロックはコールバックに似ています。 fは@ postのフォームビルダーオブジェクトです f.input(正しいタイプの入力タグを指定します):captionはフォームを構築したい@postのフィールドです

POSTメソッドはあなたのモデルとは関係ありませんFYI。そのHTTPメソッド及び他のモデルの

@post = current_user.posts.build(post_params). 

post_params同じままでは、渡され、特定のフィールドを可能にするのparams(フォームTDATA)をフィルタリングします。 フォームを送信すると、データは投稿キーのパラメータで利用可能になります params [:post] [:caption] ...

.buildは、モデルの新しいインスタンスを作成するパラメータが渡されます。入力したデータ .saveを使用すると、このデータがdbに保存されます

+0

したがって、 'current_user.posts.build'は、' current_user.posts.build(post_params) 'でデータを使用できるようにします。アクション??データがフォームからアクションを作成する方法はまだ100%ではありません。私はそれが新しいアクションの中で '@ post'に置かれていることを知っていますが、それを作成アクションの' @ post'にどのように入れていますか?そして、 '@ post'変数の理由は、ビュー内のブロックでそれを使用するためです。 '@ post'の代わりに' current_user.posts.build'を使用できますか? – alucinare

+0

新しい '@ post'は作成するために転送されません。それは別の要求サイクルです。 current_user.posts.build(post_params)は、新しい '@ post'を作成し、それに着信データを入力します。 –

+0

これは、受信データはどこから来ますか?入ってくるデータはフォームのものですよね?そしてフォームはそのデータを新しいアクションから '@ post'に入れました、そうですか?それとも正しいことではありませんか? 'current_user.posts.build(post_params)'が '@ post'変数に割り当てられていますが、' current_user.posts.build(post_params) 'はどこからデータを取得するのですか?フォームとの関係は何ですか? – alucinare

関連する問題