首页 > 解决方案 > ruby on rails 嵌套表单创建

问题描述

我的用户模型有很多评论,每条评论都有很多回复。

我想允许用户在评论下回复。

在个人资料页面(来自个人资料控制器并显示操作)中,我希望能够创建回复。

<div class="reply-box d-none" id="reply-box">
    <%= form_with(model: Reply, url: new_user_review_reply_path(@user, @review)) do |reply| %>
    <%= reply.hidden_field :user_id, value: @user %>
    <%= reply.hidden_field :review_id, value: @review %>
    <%= reply.text_field :reply_content%>
    <div class="comment-box-btns mb-5">
        <%= reply.submit "submit", class: 'submit-btn d-inline-block ml-2 float-right'%>
        <div class="cancel-btn d-inline-block float-right">cancel</div>
    </div>
    <% end %>
</div>

这是 route.rb

resources :users do
  resources :reviews do
    resources :replies
  end
end

这是回复控制器:

class RepliesController < ApplicationController
def new
  @user = User.find(params[:user_id])
  @reivew = @user.reviews.find(params[:review_id])
  @reply = @reivew.replies.new
end

def create
  @user = User.find(params[:user_id])
  @reivew = @user.reviews.find(params[:review_id])
  @reply = @reivew.replies.create!(reply_params)
  respond_to do |format|
    format.html {redirect_to(profile_path(param[:user_id]))}
    format.js
  end
end

private
def reply_params
  params.require(:reply).permit(
    :reply_content,
    :user_id,
    :review_id
  )
end
end

我不知道如何设置“form_with”。到目前为止,它只是说

undefined method `reply_content' for #<Class:0x007f8c7396aaa8>

reply_content 是我想使用 text_area 创建的回复字段。

我很困扰。任何帮助将不胜感激。

标签: ruby-on-rails

解决方案


由于您已经@reply = @reivew.replies.new在新操作中进行了初始化,因此您应该将此@reply对象与回复表单一起使用,而且我认为您不需要明确提供value: user_idvalue: review_id

<div class="reply-box d-none" id="reply-box">
    <%= form_for @reply, url: new_user_review_reply_path(@user, @review) do |reply| %>
    <%= reply.hidden_field :user_id %>
    <%= reply.hidden_field :review_id %>
    <%= reply.text_field :reply_content%>
    <div class="comment-box-btns mb-5">
        <%= reply.submit "submit", class: 'submit-btn d-inline-block ml-2 float-right'%>
        <div class="cancel-btn d-inline-block float-right">cancel</div>
    </div>
    <% end %>
</div>

推荐阅读