“form_with 找不到 Post 模型”

Posted

技术标签:

【中文标题】“form_with 找不到 Post 模型”【英文标题】:"form_with cannot find the Post model" 【发布时间】:2021-08-05 11:48:39 【问题描述】:

我正在尝试在我的“新”页面上创建表单。我正在使用 form_with。我已经检查了我的路由、控制器和视图,但我还没有发现问题。

返回的错误是:

NameError in Pages # new
undefined local variable or method `post 'for # <# <Class: 0x00007f5640e1f440>: 0x00007f5640e1c060>
Did you mean? @post
Extracted source (around line # 5):

    <% = form_with (model: post, location: true) do | form | %>
      <div class = "form-group">
        <% = form.label: title%>

以下是我使用 form_with 的表单:

<h1> CREATE NEW ARTICLE </h1>
<% = form_with (model: post, location: true) do | form | %>
  <div class = "form-group">
    <% = form.label: title%>
    <% = form.text_field: title, class: 'form-control'%>
  </div>
  <div class = "form-group">
    <% = form.label: author%>
    <% = form.text_field: author, class: 'form-control'%>
  </div>
  <div class = "form-group">
    <% = form.label: body%>
    <% = form.text_area: body, class: 'form-control', rows: 10%>
  </div>
    <% = form.submit class: 'btn btn-primary', data: disable_with: 'Creating ..'%>
<% end%>

这是我的控制器:

class PagesController <ApplicationController
def articles
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def show
   @post = Post.find (params [: id])
  end

  def create
    @post = @ Post.new (post_params)
    @ post.save
    redirect_to article_path (@post)
   end
 private

  def post_params
    params.require (: post) .permit (: title,: author,: body)
  end
end

现在这是我的路线:

Rails.application.routes.draw do
root 'pages # index'
get 'articles', to: 'pages # articles'
 get 'articles / new', to: 'pages # new'
 get 'articles /: id', to: 'pages # show', as: 'article'
 post 'articles', to: 'pages # create'
end 

【问题讨论】:

你真的有post模型吗? 是的。包括我可以毫无问题地在控制台上创建帖子 【参考方案1】:

您的代码 sn-ps 中存在很多空白问题,但我认为这可能是您复制代码的副作用,而不是任何故意的原因。

您看到的错误是因为 form_with 方法不知道 post 是什么。在您的控制器中,您在new 方法中设置@post,这意味着new.html.erb 将能够看到实例变量@post,但它不会知道post 是什么(没有@987654328 @) 是。

因此,如果表单是 new.html.erb,您需要在此处使用 @post 代替 post

也就是说,常见的 Rails 行为是在自己的部分 _form.html.erb 中拥有表单。这里可能就是这种情况(您没有指定视图的文件名)。在这种情况下,您可以告诉部分使用局部变量,而不是主模板文件使用的实例变量

为此,您需要在对表单的render 调用中将实例变量映射到本地变量,例如:

# in new.html.erb
<%= render 'form', post: @post` %>

这就是说'将我可以看到的对象作为@post,并将其作为表单模板中的post局部变量提供'。

【讨论】:

我创建了一个部分的 _form.html.erb,将我所有的代码放在表单中,我的 new.html.erb 页面现在只有 【参考方案2】:

替换

<% = form_with(model: post, location: true) do | form | %>
.....
<% end %>

<% = form_with(model: post, local: true) do | form | %>
....
<% end %>

new.html.erb 应该包含

<%= render 'form', post: @post` %>

并使用posts_controller.rb 更新您的控制器

class PostsController < ApplicationController
before_action :find_post, only: [:show]

 def index
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def show
   
  end

  def create
    @post = Post.new(post_params)
    @post.save
    redirect_to @post
   end
 
private
 def find_post
   @post = Post.find(params[:id])
 end

  def post_params
    params.require(:post).permit(:title, :author, :body)
  end
end

Routes 应该是

get 'posts', to: 'posts#index'
get 'posts/new', to: 'posts#new'
get 'posts/:id', to: 'posts#show'
post 'posts', to: 'posts#create'

或者简单地说

resources :posts, only: [:index, :new, :show, :create]

【讨论】:

我做到了(&lt;%= form_with(model: post, local: true) do |form| %&gt;)但出现错误:undefined method posts_path' for #:0x00005614177f2b10>` @Lucas Araujo 和 &lt;%= form_with(model: post, local: true) do |form| %&gt;) rails 将提供 posts_path url helper 但在您的 routes 中未定义。我已经更新了controllerroutes。请查看更新的答案

以上是关于“form_with 找不到 Post 模型”的主要内容,如果未能解决你的问题,请参考以下文章

vc++编程找不到头文件。。。急求解决方法。。

CMake找不到头文件

./configure 找不到头文件

cmake找不到头文件

[VScode]关于找不到头文件的解决

GCC 找不到头文件