ruby-on-rails - 如何通过关联实现更新和销毁方法?导轨 5
问题描述
嗨,我在我的posts_controller 中创建更新和销毁方法时遇到了麻烦,我可以创建新帖子但我无法更新,我想知道如何在销毁模型的同时销毁所有与其他型号吧。
我的模型:后模型
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
has_many :has_categories
has_many :categories, through: :has_categories
validates :title, presence: true,
length: { minimum: 5 }
after_create :save_categories
def categories=(value)
@categories = value
end
private
def save_categories
@categories.each do |category_id|
HasCategory.create(category_id: category_id, post_id: self.id)
end
end
end
Has_Category 模型
class HasCategory < ApplicationRecord
belongs_to :post
belongs_to :category
end
类别模型
class Category < ApplicationRecord
validates :name, presence: true
has_many :has_categories
has_many :posts, through: :has_categories
end
所以在我的部分形式中,新的和编辑操作是这样的
<%= form_with model: @post, local: true do |form| %>
<!--Inputs before the categories-->
<div>
<label>Categories</label>
<% @categories.each do |category| %>
<div>
<%= check_box_tag "categories[]", category.id %> <%= category.name %>
</div>
<% end %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
我的 posts_controller 创建和更新方法
def create
@post = Post.new(post_params)
@post.categories = params[:categories]
if @post.save
redirect_to @post
else
render :new
end
end
def update
@post = Post.find(params[:id])
@post.categories = params[:categories]
if @post.update(post_params)
redirect_to @post
else
render :edit
end
end
我的创建操作正在运行,但更新操作只是更新 check_box_tag 之前的输入。我知道我的 Post 模型上的save_categories方法是获取我从表单接收到的数组并创建 HasCategory 关联的方法,考虑到很多情况,我应该如何进行更新操作甚至销毁操作去很多协会?
解决方案
该行为has_many :categories, through: :has_categories
您category_ids
提供邮寄服务。所以你可以改变你的形式:
<%= form_with model: @post, local: true do |form| %>
<!--Inputs before the categories-->
<div>
<label>Categories</label>
<%= f.collection_check_boxes(:category_ids, @categories, :id, :name)
</div>
<div>
<%= form.submit %>
</div>
<% end %>
和控制器:
def create
# you need it here for correct rerendering `new` on validation error
@categories = Category.all # or maybe you have here more complicated query
@post = Post.new(post_params)
if @post.save
redirect_to @post
else
render :new
end
end
def update
# you need it here for correct rerendering `edit` on validation error
@categories = Category.all # or maybe you have here more complicated query
@post = Post.find(params[:id])
if @post.update(post_params)
redirect_to @post
else
render :edit
end
end
private
def post_params
params.require(:post).permit(:name, :some_other_post_params, category_ids: [])
end
您需要categories=(value)
从 Post 模型中删除回调和方法。并@categories
在new
andedit
动作中定义。如果它等于Category.all
,您可以将其放入表单:f.collection_check_boxes(:category_ids, Category.all, :id, :name)
,而不定义 @variable
推荐阅读
- google-cloud-platform - 限制对 GCP Console for Enterprise 的登录访问
- python - py2app 不断将“--iconfile”添加到 DATA_FILES
- javascript - 使用javascript修改基于iframe的HTML DOM
- sql - 如何计算与唯一 ID 有关的值更改的次数?
- javascript - 从嵌套数组中提取子数组
- spring-boot - 如何在我的新 grails 3 应用程序中使用现有的 web.xml?
- intellij-idea - IntelliJ IDE 上的 CucumberJvmSMFormatter 错误
- javascript - 使用 AJAX 调用 php 文件
- pact - PACT Bamboo 测试结果解析器
- angular - 如何使用 RxJS 处理 Angular 服务中的多个 api 调用?