如何使用自定义路径的form_for?

时间:2015-12-15 22:49:39

标签: ruby-on-rails ruby routes resources

自定义路由:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

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

  

这可以与Action Pack中的记录标识一起使用,以允许例如Client&lt;公司要做一些像渲染部分:@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