gpt4 book ai didi

ruby-on-rails - form_for 混合 id 和 locale 参数

转载 作者:太空宇宙 更新时间:2023-11-03 17:35:24 25 4
gpt4 key购买 nike

我正在尝试让 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 时它工作正常页面,这里是 Controller 代码:

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 的参数.那是错误信息:

No route matches {:action=>"show", :controller=>"posts", :locale=>#, :id=>nil, :format=>nil} missing required keys: [: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/}

最佳答案

这可能需要一些额外的工作,但为新建和编辑操作提供单独的表单容器仍然是一种可接受的模式,例如:

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 %>

所以这是一种选择。您在 _form.html.erb 部分呈现通用表单字段,并在各自的表单容器中执行您的新建/编辑所独有的任何内容。

但是,如果您真的只想拥有一个表单容器文件,您可以随时这样做:

<%= form_for(@post, url: (@post.new_record? ? posts_path : post_path(@post)) ) do |f| %>

注意:我不确定语言环境 gem 是如何工作的,所以我排除了上面的内容......但是如果你确实需要明确地包含语言环境,你可以使用例如post_path(@post, locale: params[:locale])。回想一下,post_path(@post) 实际上是 post_path(id: @post) 的缩写。也就是说,如果没有明确说明,您传递给命名路由的参数的顺序与您的路由期望的参数相同。

关于ruby-on-rails - form_for 混合 id 和 locale 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18535349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com