将回复与帖子相关联

时间:2019-03-08 10:46:28

标签: ruby-on-rails

我正在尝试构建一个非常基本的类似于论坛的应用程序,用户可以在其中创建主题并回复现有主题。

主题创建工作正常,并且能够显示“答复”表单,但是,“答复创建”操作无法正常工作。我没有任何错误,只是redirects_to topics_path

这是一个教程,所以代码不是我的。有谁能找到明显的原因?任何帮助,不胜感激!


replies_controller.rb

def create
    @topic = Topic.find(params[:topic_id])
    @reply = @topic.replies.create(params[:reply].permit(:reply))
    @reply.user_id = current_user.id if current_user
    @reply.save

    if @reply.save
        redirect_to topic_path(@topic)
    else
        flash[:notice] = "Error."
        redirect_to topics_path
    end
end

reply.rb

class Reply < ApplicationRecord
  belongs_to :post
  belongs_to :user
end

replies / _form.html.erb

<%= form_for [@topic, @topic.replies.create] do |f| %>
    <%= f.label :reply %>
    <%= f.text_area :reply, class: "textarea", rows: "10" %>

    <%= f.submit class: "button is-primary" %>
<% end %>

topic.rb

class Topic < ApplicationRecord
    belongs_to :user
    has_many :replies
end

schema.rb

create_table "topics", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "user_id"
end

create_table "replies", force: :cascade do |t|
    t.text "reply"
    t.bigint "topic_id"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["topic_id"], name: "index_replies_on_topic_id"
    t.index ["user_id"], name: "index_replies_on_user_id"
end

1 个答案:

答案 0 :(得分:0)

在文件 reply / _form.html.erb 中 您应该使用构建方法build而不是create。替换行:

<%= form_for [@topic, @topic.replies.create] do |f| %>

<%= form_for [@topic, @topic.replies.build] do |f| %>

代码还有其他问题:

@reply = @topic.replies.create(params[:reply].permit(:reply))

在此行中,您必须在没有用户的情况下呼叫new + save。 将此更改为:

@reply = @topic.replies.new(params[:reply].permit(:reply))

然后,您两次致电save

@reply.save

    if @reply.save
...

第一行是不必要的。

最后,回滚的原因是什么?在您的Reply模型中,您有:

belongs_to :post

但是在schema.rb和参数中,您有topic

Schema.rb

t.bigint "topic_id"

参数

"reply"=>{"reply"=>"Test reply"}, "commit"=>"Create Reply", "topic_id"=>"4"}