0

更新: 解決しました。ありがとう、ビジーマーク!
編集:これは、BushyMark からの以下の回答に基づいて改訂されています。提案されたすべての変更を正しく行ったと思いますが、ユーザーがメッセージを送信したときに post_type_id をデータベースに保存することはまだできません。

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

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

つまり、プロファイル モデル、ポスト モデル、およびポスト タイプ モデルがあります。

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 create
  @post = current_user.profile.posts.build(:message => params[:message], :post_type_id => params[:post_type_id])
    if @post.save
      redirect_to user_profile_path
    else
      flash[:notice] = "Message failed to save."
      redirect_to user_profile_path
  end
end

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

<% form_tag(:controller => "posts", :action => "create") do %>
  <%= label_tag(:message, "Update your people") %><br />
 <%= text_area_tag(:message, nil, :size => "27x3") %>
 <div class="updateSubmit"><%= submit_tag("Update") %></div>
 <%= label_tag(:type_id, "Optional: Update 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 %></div>
   <p><%=h c.post_type %></p>
   <p>Posted <%=h time_ago_in_words(c.created_at) %> ago</p>
    <% end %>

それが背景です。これが問題です。私の現在のセットアップでは、ユーザーがメッセージを送信すると、メッセージは投稿データベース テーブルに送信されますが、post_id は送信されません。

私のselectタグは次のようにレンダリングされています:
<select id="post_post_type_id" name="post[post_type_id]"><option value="">Please select</option>

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

Parameters: {"message"=>"This is another test.", "commit"=>"Update", "action"=>"create", "authenticity_token"=>"redacted", "post"=>{"post_type_id"=>"3"}, "controller"=>"posts", "user_id"=>"1"}

User Load (0.3ms) SELECT * FROM "users" WHERE ("users"."id" = 1)

Profile Load (0.7ms) SELECT * FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1

Post Create (0.5ms) INSERT INTO "posts" ("message", "updated_at", "post_type_id", "profile_id", "created_at") VALUES('Hello', '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     "message"
    t.integer  "profile_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "post_type_id"
  end`
4

1 に答える 1

1

これまでのところ、ここでいくつかのことが起こっています。

type は Rails の予約語です。単一テーブルの継承に使用されます。列名を「post_type」などに変更すると、ランダムな問題を解決するのに非常に役立ちます。私はしばらく前にこれを経験し、STIについて知る前に頭を悩ませていました.

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

お役に立てれば!

別の編集:挿入ステートメントに、「タイプ」列があるように見えますか? これは、リレーションシップを使用するときにも問題を引き起こします。別の「タイプ」モデルを使用していますか? 上記のステートメントのいずれかが役に立たない場合は、スキーマを投稿できますか?

ActiveRecord では、タイプ列は予約されており、適切に表示されません (単一テーブルの継承に関する私のステートメントに戻ります)。この時点で、type 列と type_id 列を取り除き、Post に " post_type_id" 列を与えることを強くお勧めします。

次に、別のpost_typeモデルを作成しhas_many :postsたら、それを確認する必要がありますPost :belongs_to :post_type(外部キーがあるため)。これを行うと、呼び出しが可能になりpost_object.post_type、探しているモデル関係が返されます。

于 2009-09-03T08:00:58.790 に答える