新人来了!
我试图提交一个嵌套模型的表单,但没有成功。
目的:
通过向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 %>
新建/创建表单失败。发生的情况是,entry
实例很受欢迎,但我未能为属于entry
的review
创建一个新的模型实例。
entry.review
对review
引发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
中使用操作。文档应该能让你从这里开始。