Rails 4 呈现简单形式 NEW in INDEX

Rails 4 render simple-form NEW in INDEX

在尝试渲染 simple_form new in index.I 时,已遵循 http://guides.rubyonrails.org/v2.3.11/layouts_and_rendering.html ,in that 2.2.2 Rendering an Action's View 并且我在 Posts#index 中收到错误 NoMethodError ,NilClass:Class

的未定义方法 `model_name'

class PostsController < ApplicationController
 before_action :find_post, only: [:show, :edit, :update, :destroy]
 before_action :authenticate_user!,except:[:index,:show]

 def index
  @posts = Post.all.order("created_at DESC")
  render 'new'
 end
 
 def new
  @post = current_user.posts.build
 end




index.html.haml

- if user_signed_in?
 = link_to "New Post", new_post_path

- @posts.each do |post|
 %h2.post= link_to post.post, post
 %h4.post= link_to post.location, post
 %h4.post= link_to post.tag_list, post
 %p.date
  Published at
  = time_ago_in_words(post.created_at)
  by
  = post.user.email



_form.html.haml

= simple_form_for @post do |f|
 = f.input :post
 = f.input :location
 = f.input :tag_list
 = f.input :active
 = f.submit


new.html.haml

%h1 Post 

= render 'form'

尝试从控制器中删除 render new,正如您已经在视图文件 index.html.haml 文件中提到的那样。 当您收到 NilClass 错误时,您的控制器也会看起来像这样。:

def index
    @posts = Post.all.order("created_at DESC")
    @post = Post.new
end

让我们把事情搞清楚。

你的控制器有几个actions基本对应"what do I want to do...in one single page render/AJAX request"。我相信您不清楚的是,在同一页面上显示索引和显示表单对应于一个独特的控制器操作!

现在你想做什么,正如 ahmad hamza 所建议的,它在你的 index 动作中实例化两个变量

  • @posts,您将在其中放置所有 post 的列表(索引)
  • @new_post 对应于用户可以直接从索引

    添加的新 post
    def index
        @posts = Post.all.order("created_at DESC")
        @new_post = current_user.posts.build
    end
    

现在,也许您还有其他操作想要显示表单以创建新的 posts,而不仅仅是在索引中。

这就是为什么我们通常写 partials 来做这些事情。然而,一个好主意是让这些部分在任何地方都可以重用,而不限制变量名。

换句话说,你想要

/views/posts/_form.html.haml

= simple_form_for post do |f| # Notice : not @post but post 
    = ...

现在,您希望从您的索引文件中显示一些内容和 @new_post

的表单

/views/posts/index.html.haml

- if user_signed_in?
= link_to "New Post", new_post_path

- @posts.each do |post|
    %h2.post= link_to post.post, post
    %h4.post= link_to post.location, post
    %h4.post= link_to post.tag_list, post
    %p.date
        Published at
        = time_ago_in_words(post.created_at)
        by
        = post.user.email
- render 'form', post = @new_post