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
在尝试渲染 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 的列表(索引)
添加的新 post@new_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