我正在尝试构建一个非常基本的类似于论坛的应用程序,用户可以在其中创建主题并回复现有主题。
主题创建工作正常,并且能够显示“答复”表单,但是,“答复创建”操作无法正常工作。我没有任何错误,只是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
答案 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"}