如何从部分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 %>

新建/创建表单失败。发生的情况是,entry实例很受欢迎,但我未能为属于entryreview创建一个新的模型实例。

entry.reviewreview引发nil错误,而entry在通过浏览器控制台测试时是正常的

form中的第一个参数不能包含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中实施我的行动?

我也发现这里的教程很有用,但是复制不成功。

这里有另一个StackOverflow引用

我仍然得到错误entry.review.build,审查是nil。

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

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

@review = entry.review.build(review_params)

你需要使用以下命令:

@review = entry.build_review(review_params)

详情请参阅文档

我应该在entres_controller中实现我的动作吗?

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

但是,如果您希望能够使用相同的表单创建或更新条目以及的审查,那么您应该将审查表单嵌套在条目的表单中,保留accepts_nested_attributes_for,并在EntriesController中使用操作。文档应该能让你从这里开始。

最新更新