如何在自定义路由中使用form_for?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在自定义路由中使用form_for?相关的知识,希望对你有一定的参考价值。

自定义路由:

resources :blog, controller: 'posts'

如何重写此行<%= simple_form_for(@post, blog_path) do |f| %>以摆脱以下错误?

TypeError in Posts#edit
ActionView::Template::Error (no implicit conversion of Symbol into Integer)

我也尝试了<%= simple_form_for(blog_path(@post)) do |f| %>,它摆脱了错误,但如果我想编辑表单,输入将清空他们保存的数据。

posts_controller

  def new
    @post = Post.new
    respond_with(@post)
  end

  def edit
  end

  def create
    @post = Post.new(post_params)
    if current_user.admin
      @post.save
      respond_with(@post)
    else
      flash[:success] = 'Get out of here.'
      redirect_to root_url
    end
  end
答案

它可以采用哈希选项,包括url,所以像这样:

编辑:将blog_path更改为blogs_pathblog_path是show动作,而不是创建动作,因此需要一个id(并且无论如何都不是帖子路径)。试试这种方式。

<%= simple_form_for(@post, url: blogs_path) do |f| %>
另一答案

不知道这是否适用,但是前几天发现的一个非常酷的功能是.becomes - 您可以在其中更改对象的“类”,以便Rails以不同的方式处理它:

这可以与Action Pack中的记录标识一起使用,以允许客户<公司执行诸如渲染部分:@client.becomes(Company)之类的操作,以使用公司/公司部分而不是客户端/客户端来呈现该实例。

所以...

如果你有一个Blog模型,并希望每个@post都被这样对待(再次,我不知道这是否是你的设置),你可以做以下事情:

<%= simple_form_for @post.becomes(Blog) do |f| %>

如果不合适,我会删除;它对我来说非常方便。


更新

如果您希望自己的posts_path成为博客(IE url.com/blog/1),那么您需要查看路由生成器使用path选项:

#config/routes.rb
resources :posts, path: "blog", as: :blog # -> url.com/blogs/2

以上是关于如何在自定义路由中使用form_for?的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

如何在自定义PyYAML构造函数中处理递归?

如何在自定义 PyYAML 构造函数中处理递归?

我有3个嵌套路线:class / post / comments我不知道如何编写_form文件中的form_for