Pac*_*ane 1 ruby ruby-on-rails form-for globalize3
我正在努力让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
Run Code Online (Sandbox Code Playgroud)
我用它form_for来创建和更新帖子.这是视图代码:
<%= form_for(@post) do |f| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
它在我进入/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
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用url编辑帖子时/en/posts/1/edit,它会混合传递给的文件form_for.这是错误信息:
没有路由匹配{:action =>"show",:controller =>"posts",:locale =>#,:id => nil,:format => nil}缺少必需的键:[:locale,:id]
我的问题是:它为什么这样做,我该如何修复thix?
我已经尝试过一些事情,例如将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"}
Run Code Online (Sandbox Code Playgroud)
所以,是的,如果我可以避免这样做,我真的不想使用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/}
Run Code Online (Sandbox Code Playgroud)
这可能是一些额外的工作,但仍然是一个可接受的模式,为新的和编辑操作有一个单独的表单容器,例如:
new.html.erb
<%= form_for(@post, url: posts_path) do |f| %>
<%= render 'form', f: f %>
<%= f.submit 'Create' %>
<% end %>
edit.html.erb
<%= form_for(@post, url: post_path(@post)) do |f| %>
<%= render 'form', f: f %>
<%= f.submit 'Update' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
所以这是一个选择.您可以在_form.html.erbpartial中渲染常用表单字段,并在各自的表单容器中执行新/编辑的唯一操作.
但是,如果您真的只想拥有一个表单容器文件,则可以始终执行此操作:
<%= form_for(@post, url: (@post.new_record? ? posts_path : post_path(@post)) ) do |f| %>
Run Code Online (Sandbox Code Playgroud)
注意:我不确定locales gem是如何工作的所以我将其排除在上面...但如果你确实需要明确包含语言环境,你可以用例如post_path(@post, locale: params[:locale]).回想一下,这post_path(@post)实际上是昙花一现post_path(id: @post).也就是说,如果没有明确说明,您传递到命名路线的参数的排序方式与路线期望的参数相同.
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |