如何从部分 Rails 6 创建嵌套模型
How to create nested model from partial 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
实例传递给部分,完美运行
# /entries/index.html.erb
<% @entries.each do |entry| %>
...
<%= render 'reviews/new', entry: entry %>
...
<% end %>
未能成功设置 new/create 表格。
entry
实例很受欢迎,但我无法为属于 entry
.
的 review
创建新模型实例
entry.review
为 review
引发 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 应该可以帮助您入门。
这里是新手!
我尝试提交嵌套模型的表单失败。
目标:
通过向 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
实例传递给部分,完美运行
# /entries/index.html.erb
<% @entries.each do |entry| %>
...
<%= render 'reviews/new', entry: entry %>
...
<% end %>
未能成功设置 new/create 表格。
entry
实例很受欢迎,但我无法为属于 entry
.
review
创建新模型实例
entry.review
为 review
引发 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 应该可以帮助您入门。