当我在rails中使用scaffold时,控制器会创建各种方法,如
new,create,show,index等
但在这里我无法理解新动作的过渡以创造行动
例如。当我点击新帖子时它会查找新动作,现在它呈现_form,但是在提交时如何将数据输入到该特定表格中,控制器的创建操作在哪里调用?如何? < / p>
我的posts_controller 是
def new
@post = Post.new
@post.user_id = current_user.id
@post.save
respond_to do |format|
format.html # new.html.erb
format.json { render json: @post }
end
end
# GET /posts/1/edit
def edit
@post = Post.find(params[:id])
authorize! :manage, @post
end
# POST /posts
# POST /posts.json
def create
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render json: @post, status: :created, location: @post }
else
format.html { render action: "new" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:5)
默认情况下脚手架在表单(read here)
上当用户单击此表单上的“创建发布”按钮时,浏览器 将信息发送回控制器的创建动作 (Rails知道调用create动作,因为表单是随之发送的 HTTP POST请求;这是其中一个惯例 前面提到过):
def create
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to(@post,
:notice => 'Post was successfully created.') }
format.json { render :json => @post,
:status => :created, :location => @post }
else
format.html { render :action => "new" }
format.json { render :json => @post.errors,
:status => :unprocessable_entity }
end
end
end
如果您想在新表格支架上自定义操作,则应在表单上添加:url => {:action => "YourActionName"}
。
示例:
#form
form_for @post, :url => {:action => "YourActionName"}
#controller
def YourActionName
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to(@post,
:notice => 'Post was successfully created.') }
format.json { render :json => @post,
:status => :created, :location => @post }
else
format.html { render :action => "new" }
format.json { render :json => @post.errors,
:status => :unprocessable_entity }
end
end
end
#route
match '/posts/YourActionName`, 'controllers#YourActionName', :via => :post
答案 1 :(得分:1)
这都是关于HTTP动词和路由的。
您的表单会向/posts
路由发出POST请求。如果您使用rake routes
列出路线,则会看到针对该特定路线的所有POST请求都定向到create
中的PostsController
操作,或简称为posts#create
答案 2 :(得分:1)
当您将浏览器指向/posts/new
时,它会呈现new
操作,该操作会向您显示要填写的表单(在app/views/posts/new.html.erb
和app/views/posts/_form.html.erb
中定义。单击表单中的提交按钮,它会将您的数据发布到create
操作,该操作实际上会在数据库中创建记录。
查看你的PostsController代码,你可能不想拥有该行
@post.save
在您的new
操作中,因为这会将空白记录保存到数据库 - 无论用户是否填写表单。而且,你可能想要移动
@post.user_id = current_user.id
到您的create
操作,因为那是您实际将帖子保存到数据库的位置。