我正在为我的应用程序添加一个新模型,基本上是一个论坛,上面将有帖子。帖子属于论坛。
在为我的帖子撰写新页面时,我有以下几点:(我正在使用HAML,这就是为什么它看起来可能有点怪异的原因)
= form_for(model: [@forum, @post], local: true) do |form|
.form-group
.col-sm-2.control-label
= form.label :title
.col-sm-12
= form.text_field :title, class: "form-control", placeholder: "Title of post", autofocus: true
.form-group
.col-sm-2.control-label
= form.label :description
.col-sm-12
= form.text_area :description, rows: 8, class: "form-control", placeholder: "Body of post"
.form-group
.col-sm-12
= form.submit class: 'btn btn-primary btn-lg'
我有form_for(model:@post),那也不起作用。 当它尝试创建帖子时,我们会收到此错误
NoMethodError in Posts#new
undefined method `model_name' for #<Hash:0x00007f801c9d39d0>
并突出显示此行
= form_for(model: [@forum, @post], local: true) do |form|
我不知道为什么会这样,并且没有类似的修复程序对我有用。这是我的posts_controller.rb:
class PostsController < ApplicationController
before_action :set_post, only: [:edit, :show, :update, :destroy]
before_action :require_user, except: [:index, :show]
def show
@post = Post.find(params[:id])
end
def new
@post = Post.new
end
def edit
@post = Post.find(params[:id])
end
def create
@forum = Forum.find(params[:forum_id])
@post = @forum.posts.create(post_params)
@post.user = current_user
if @post.save then
redirect_to @post
else
render 'new'
end
end
def update
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to(forums_path)
end
private
def set_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title)
end
end
感谢您的帮助。
答案 0 :(得分:0)
form_with
在Rails 5中引入,以替换具有不同签名的form_for
和form_tag
。
form_for
的签名为form_for(record, options = {}, &block)
。这意味着这些是等效的:
form_for([@forum, @post])
form_with(model: [@forum, @post], local: true)
这也解释了错误消息:
NoMethodError in Posts#new
undefined method `model_name' for #<Hash:0x00007f801c9d39d0>
当您将哈希作为第一个参数传递给form_for
时。