当我添加has_many时,突然没有保存一些数据

时间:2018-04-23 05:23:12

标签: ruby-on-rails associations has-many

我有3个模型,Challenge,Pun,User(由Clearance gem管理)

用户可以创建挑战。挑战包含许多双关语。用户还可以创建双关语。

一切都很好,直到我设置一个Pun为belongs_to一个用户,然后突然Puns不再保存。

  def create
    @pun = @challenge.puns.create(pun_params)
    @pun.user_id = current_user.id if current_user
    redirect_to @challenge
  end

  private

  def set_challenge
    @challenge = Challenge.find(params[:challenge_id])
  end

  def pun_params
    params[:pun].permit(:pun_text,:user_id)
  end

在我的PunController中,我尝试建立current_user id

  create_table "challenges", force: :cascade do |t|
    t.text "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.datetime "start_time"
    t.datetime "end_time"
    t.bigint "user_id"
    t.index ["user_id"], name: "index_challenges_on_user_id"
  end

  create_table "puns", force: :cascade do |t|
    t.text "pun_text"
    t.bigint "challenge_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id"
    t.index ["challenge_id"], name: "index_puns_on_challenge_id"
    t.index ["user_id"], name: "index_puns_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "tagline"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "encrypted_password", limit: 128
    t.string "confirmation_token", limit: 128
    t.string "remember_token", limit: 128
    t.index ["email"], name: "index_users_on_email"
    t.index ["remember_token"], name: "index_users_on_remember_token"
  end

我做错了什么?我试图尽可能简单地保持它,但似乎用户不希望与多个事物相关联,特别是如果嵌套。这是清关问题吗?

数据库设置:

<body>
<div>
  <div>
    <div>
      ...
    </div>
  </div>
</div>
</body>

2 个答案:

答案 0 :(得分:1)

在您的代码中,您在设置后不保存user_id。如果您不希望创建失败,您可以“创建!”。 所以你可以尝试:

Windows6.1-KB2999226-x64.msu

答案 1 :(得分:0)

您可以像

一样使用hidden_field来完成此操作
<%= object.hidden_field :user_id, value: current_user.id %>

如果没有用户会话,它将无法工作,因为该关系不是可选的,并从控制器中删除此行

@pun.user_id = current_user.id if current_user

并重定向

redirect_to @pun

它会起作用