如何解决如何从部分 Rails 6 创建嵌套模型
新手来了!
我尝试提交嵌套模型的表单失败。
目标:
通过向 reviews
模型提交布尔值来验证翻译,以将翻译是否经过验证与翻译 entry
和 user
模型关联引用相关联。
# 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
实例很受欢迎,但我未能为属于 review
的 entry
创建新模型实例。
entry.review
为 nil
引发 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 很有用,但复制失败。
我仍然收到错误 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 举报,一经查实,本站将立刻删除。