我正在尝试让 Globalize3 在我的应用程序上运行。我有博客文章的玩具项目,我想翻译。
我的网址如下所示:localhost/en/posts
localhost/fr/posts
这是我在我的ApplicationController
before_action :set_locale
def set_locale
I18n.locale = params[:locale] if params[:locale] || I18n.default_locale
end
我使用相同form_for
的方法来创建和更新帖子。这是查看代码:
<%= form_for(@post) do |f| %>
...
<% end %>
当我转到/new
页面时它工作正常,这是控制器代码:
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to action: :show, id: @post.id
else
render 'new'
end
end
但是当我尝试使用 url 编辑帖子时/en/posts/1/edit
,它会混合传递给form_for
. 那是错误信息:
没有路由匹配 {:action=>"show", :controller=>"posts", :locale=>#, :id=>nil, :format=>nil} 缺少必需的键:[:locale, :id]
我的问题是:为什么要这样做,我该如何解决?
我已经尝试过一些事情,比如将form_for
声明更改为:
<%= form_for(@post, url: {action: 'show', id: @post, locale: params[:locale]} ) do |f| %>
所以它适用于update
但不适用于new
因为我的帖子没有id
No route matches {:action=>"show", :locale=>"en", :id=>#<Post id: nil, created_at: nil, updated_at: nil, title: nil, text: nil>, :controller=>"posts"}
所以,是的,如果我可以避免这样做,我真的不想使用 2 个表单来创建和更新。有没有这样做的好方法?
编辑:
这是我的耙子路线
Prefix Verb URI Pattern Controller#Action
posts GET /:locale/posts(.:format) posts#index {:locale=>/en|fr/}
POST /:locale/posts(.:format) posts#create {:locale=>/en|fr/}
new_post GET /:locale/posts/new(.:format) posts#new {:locale=>/en|fr/}
edit_post GET /:locale/posts/:id/edit(.:format) posts#edit {:locale=>/en|fr/}
post GET /:locale/posts/:id(.:format) posts#show {:locale=>/en|fr/}
PATCH /:locale/posts/:id(.:format) posts#update {:locale=>/en|fr/}
PUT /:locale/posts/:id(.:format) posts#update {:locale=>/en|fr/}
DELETE /:locale/posts/:id(.:format) posts#destroy {:locale=>/en|fr/}