如何从部分 Rails 6 创建嵌套模型

How to create nested model from partial Rails 6

这里是新手!

我尝试提交嵌套模型的表单失败。

目标:

通过向 reviews 模型提交一个布尔值来验证翻译,以关联翻译是否经过验证,以及翻译 entryuser 模型相关参考。

# routes.rb
resources :entries do
   resources :reviews
end


# entry.rb
belongs_to :user
has_one :review
accepts_nested_attributes_for :review


# user.rb
has_many :entries
has_many :reviews


# review.rb
belongs_to :user
belongs_to :entry

entry 索引,将 entry 实例传递给部分,完美运行

# /entries/index.html.erb
<% @entries.each do |entry| %>
   ...
   <%= render 'reviews/new', entry: entry %>
   ...
<% end %>

未能成功设置 new/create 表格。 entry 实例很受欢迎,但我无法为属于 entry.

review 创建新模型实例

entry.reviewreview 引发 nil 错误,而 entry 在通过浏览器控制台测试时没问题

First argument in form cannot contain nil or be empty

# reviews/_new.html.erb
<span>
  <%= form_for entry.review do |f| %>
    <div class="form-check form-switch">
      <%= f.check_box :verified, class: "form-check-input" %>
    </div>
    <%= f.submit class: "btn btn-primary"%>
  <% end %>
</span>

另一种尝试也是仅使用来自控制器的 @review,但它不遵守嵌套路由。

我的控制器看起来像这样

# reviews_controller.rb

def create
    @entry = Entry.find(params[:entry_id])
    @review = @entry.review.build(review_params)
    @review.user_id = current_user.id
    @review.save
end

private

def review_params
   params.require(:review).permit(:verified, user: current_user, entry: @entry)
end

我想在 entries_controller 中执行我的操作吗?

我也发现教程 here 很有用,但复制不成功。

另一个 Whosebug 参考资料here

我仍然收到评论为零的错误 entry.review.build

First argument in form cannot contain nil or be empty

has_one 关系上构建关联记录时,而不是

@review = entry.review.build(review_params)

您需要使用以下内容:

@review = entry.build_review(review_params)

有关详细信息,请参阅 documentation

Am I suppose to implement my actions in the entries_controller?

这取决于你追求什么。如果您有一个用于添加新评论的专用表单,并且它没有嵌入到另一个用于创建或更新条目的表单中,那么在 ReviewsController 中实施 create 操作是最直接的解决方案——在这种情况下,您应该在 Entry.

中也不需要 accepts_nested_attributes_for

但是,如果您希望能够使用相同的形式创建或更新条目以及其评论,那么你应该将审核表单嵌套在条目的表单中,保留accepts_nested_attributes_for,并在EntriesController中使用操作。 documentation 应该可以帮助您入门。