微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从部分 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 实例传递给 partial,完美运行

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

未能成功设置新/创建表单。 发生的情况是 entry 实例很受欢迎,但我未能为属于 reviewentry 创建新模型实例。

entry.reviewnil 引发 review 错误,而通过浏览器控制台进行测试时 entry 没问题

表单中的第一个参数不能包含 nil 或为空

# 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 很有用,但复制失败。

一个 StackOverflow 参考 here

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

表单中的第一个参数不能包含 nil 或为空

解决方法

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

@review = entry.review.build(review_params)

您需要使用以下内容:

@review = entry.build_review(review_params)

有关详细信息,请参阅 documentation

我是否应该在 entry_controller 中实现我的操作?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。