Rails项目从Globalize迁移至Mobility:如何删除单个模型翻译?
如何在Mobility中删除模型的单个翻译
嘿,我之前刚把项目从Globalize迁移到Mobility,刚好能帮到你!Mobility其实提供了很简便的方法来删除单个locale的翻译,具体操作分两种情况,取决于你用的是哪种存储后端:
1. 表存储后端(Table Backend)
如果你的Mobility配置是用独立的翻译表(比如post_translations对应Post模型),有两种方式删除单个翻译:
方法一:直接操作翻译记录
你可以直接找到对应locale的翻译记录并销毁:
# 假设你的模型是Post,要删除法语翻译 @post.translations.find_by(locale: :fr).destroy
方法二:使用Mobility内置的remove_translation方法
Mobility提供了更简洁的API,直接调用即可:
@post.remove_translation(:fr) # 或者用 bang 版本自动保存 @post.remove_translation!(:fr)
2. JSONB/列存储后端(Column Backend)
如果你的翻译存在模型表的JSONB/JSON字段里(比如translations字段),同样可以用remove_translation方法,它会自动把对应locale的键从JSON结构中移除:
@post.remove_translation(:es) @post.save # 或者用 remove_translation! 自动触发保存
实战示例:在视图中添加删除按钮
和你之前用Globalize的思路类似,你可以在管理页面为每个已翻译的locale添加删除按钮,步骤如下:
第一步:添加路由
在routes.rb中为模型添加删除翻译的动作:
resources :posts do delete :destroy_translation, on: :member end
第二步:控制器处理动作
在对应的控制器(比如PostsController)中添加处理方法:
def destroy_translation @post = Post.find(params[:id]) # 把参数里的locale转成符号 locale = params[:locale].to_sym if @post.remove_translation!(locale) redirect_to edit_post_path(@post), notice: "#{locale.to_s.upcase} translation deleted successfully!" else redirect_to edit_post_path(@post), alert: "Failed to delete translation." end end
第三步:视图中渲染删除按钮
在编辑页面循环所有可用locale,为已有翻译的locale显示删除按钮:
<% I18n.available_locales.each do |locale| %> <div class="translation-item"> <h3><%= locale.to_s.upcase %> Translation</h3> <!-- 这里放翻译表单字段 --> <% if @post.translated?(locale) %> <%= link_to "Delete #{locale} Translation", destroy_translation_post_path(@post, locale: locale), method: :delete, data: { confirm: "Are you sure you want to delete this translation?" }, class: "btn btn-danger" %> <% end %> </div> <% end %>
这里用到的translated?方法是Mobility提供的,用来检查模型是否有对应locale的有效翻译,避免显示不必要的删除按钮。
内容的提问来源于stack exchange,提问作者partydrone
相关产品推荐
相关产品推荐

