1

我最近将我的控制器代码更新为此创建

class MicropostsController < ApplicationController
  before_filter :signed_in_user

   def create
  @micropost = current_user.microposts.build(params[:micropost])


  if @micropost.review
      params[:micropost].delete :review
      @thread = Discussion.create!(params[:micropost])    
    else
      @micropost.save

    end
    redirect_to root_path
  end

当我使用上述内容时,它似乎在创建讨论或微博时起作用。但是,我相信使用“创建!” 不保存 user_id。当我查看讨论时,user_id 为零。我怎样才能将 user_id 与发帖者一起保存?

schema.db 中的表

create_table "users", :force => true do |t|
    t.string    "name"
    t.string    "email"
    t.timestamp "created_at",                         :null => false
    t.timestamp "updated_at",                         :null => false
    t.string    "password_digest"
    t.string    "remember_token"
    t.boolean   "admin",           :default => false
  end




  create_table "discussions", :force => true do |t|
    t.string   "content"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end
4

2 回答 2

1

create!方法基本上运行一个new,然后save!如果有一个验证异常则抛出一个。

当你写这个:

@micropost = current_user.microposts.build(params[:micropost])

它(通常)使用 current_user id 初始化一个新的微博,就像你运行过一样:

@micropost = Micropost.new(params[:micropost].merge(user_id: current_user.id))

并保存它...简而言之,它与您的方法@micropost.save完全相同。create!

总之,我认为你应该删除这一行:

@micropost = Micropost.create!(params[:micropost])
于 2013-05-08T21:28:11.823 回答
0

改变

@thread = Discussion.create!(params[:micropost])   

至:

@thread = current_user.discussions.create(params[:micropost])

这将为您提供user_id

但是...我认为您的控制器正试图“做太多”。如果这是microposts为什么它会创建 adiscussion不是a的创建操作micropost

此外,如果存在验证错误,@micropost.save用户不会得到任何反馈,它只会默默地失败。create!讨论创建也是如此,当您使用该方法时,当讨论未通过验证时,您不希望他们获得通用的 http 状态 500 错误页面“出现问题” 。

于 2013-05-08T21:44:52.053 回答