0


0

更新:解決しました。 BusyMarkに感謝します。 編集:これはBushyMarkからの下記の答えに基づいて修正されます。 提案された変更をすべて正しく行ったと思いますが、ユーザーがメッセージを送信したときにpost_type_idをデータベースに保存することはできません。

私のアプリにはプロフィールページがあります。 プロフィールページで、ページの所有者は更新を入力して「送信」を押すことができます。更新メッセージは、ページをリロードせずに表示されます(つまり、 Ajax)

それは基本的にあなたのTwitterのホームページのように見えます。 しかし、アップデートを入力するときにユーザーが選択する「type」というメッセージもあります。 メッセージタイプは事前に入力されたリストです。 私はそれをモデルにし、それをアプリのシードデータとしてロードしました。

そのため、プロファイルモデル、ポストモデル、およびpost_typeモデルがあります。

profile has_many:posts` post belongs_to:post_type` post_type has_many:posts`投稿モデルもこれを持っています: attr_accessible:message、:post_type_id`

Routes.rbは次のようになります。map.resources:users、 :has_one ⇒:profile、:has_many ⇒:posts map.resources:post_types

投稿コントローラーには、投稿を作成するためのこのメソッドがあります。

def post @ current = user_profile.posts.build(:message => params [:message]、::post_type_id => params [:post_type_id])保存する。" redirect_to user_profile_pathエンドエンド

これがすべて行われるプロファイルページの「表示」ビューは、次のようになります。

<%form_tag(:controller => "posts"、:action => "create")do%> <%= label_tag(:message、 "あなたの人を更新")%>

<%= text_area_tag(:message、nil、:size => "27x3")%> <%= submit_tag( "Update")%> <%= label_tag(:type:更新タイプ)、:class => 'typeLabel')%> <%= collection_select(:post、:post_type_id、PostType.all、:id、:name、{:prompt => true})%> <%end%>

<%@ profile.profile.posts.each do | c | %> <%= h c.message%> <%= h c.post_type%>投稿<%= h time_ago_in_words(c.created_at)%>前<%end%>

それが背景です。 これが問題です。 現在の設定では、ユーザーが自分のメッセージを送信すると、そのメッセージはpostsデータベーステーブルに送信されますが、post_idは送信されません。

私のselectタグはこのようにレンダリングされています: Please select

これは私が私が記事を送信したときにログに記録される出力です:Processing PostsController#create(IP for 2009-09-03 03:03:08)[POST]

`パラメータ:{" message "⇒"これは別のテストです。 "、" commit "⇒" Update "、" action "⇒" create "、" authenticicity_token "⇒" redacted "、" post "⇒ { "post_type_id" ⇒ "3"}、 "controller" ⇒ "posts"、 "user_id" ⇒ "1"} `

ユーザーロード(0.3ms)SELECT * FROM" users "WHERE(" users "。" id "= 1)

プロファイルロード(0.7ms)SELECT * FROM" profiles "WHERE(" profiles ".user_id = 1)LIMIT 1

`ポスト作成(0.5ms)INSERT INTO"ポスト "("メッセージ "、" updated_at "、" post_type_id "、" profile_id "、" created_at ")値( 'こんにちは'、 '2009-09-03 20:40:24 '、NULL、1、' 2009-09-03 20:40:24 ') `

これが私のスキーマの関連部分で、BushyMarkのコメントに従って更新されました。

`create_table" post_types "、:force => true do | t | t.string "name" t.datetime "created_at" t.datetime "updated_at" end`

`create_table" posts "、:force => true do | t | t.text "メッセージ" t.integer "profile_id" t.datetime "created_at" t.datetime "updated_at" t.integer "post_type_id" end`

1 Answer


1


ここで起こっているカップルのことは私が今のところ見ている:

typeはRailsの予約語です。 単一表の継承に使用されます。 列名を "post_type"のように変更すると、ランダムな問題を解決するのに非常に役立ちます。 STIについて知る前に、私はしばらく経って脳を殴打していました。

また、あなたの投稿にはtype_idがあります。 。 。 しかし、私はあなたの投稿 `:belongs_to:type`を見ませんでした。 。 。 外部キーを持つモデルがすべてのActiveRecord関連を使うためにこの宣言を必要とすることを忘れないでください。

お役に立てれば!

もう一つの編集:私はあなたのinsert文の中に、 "type"カラムがあるように見えますか? これは関係を使用するときにも問題を引き起こします。 あなたは別の「タイプ」モデルを使っていますか? 上記のステートメントのいずれかが役に立たない場合、あなたはおそらくあなたのスキーマを投稿できますか?

ActiveRecordでは、型の列は予約されており、正しく表示されません(単一テーブルの継承に関する説明に戻る)。 この時点で私はあなたのtypeとtype_idカラムを取り除き、あなたのPostに "post_type_id"カラムを与えることを強く推奨します。

それから has_many:posts`という別の post_type`モデルを作成したら、あなたの `Post:belongs_to:post_type`を確認したいでしょう(外部キーを持っているので)。 それをしたら、 `post_object.post_type`を呼び出せるようになり、探しているモデルの関係が返されます。