4

当我在 rails 中使用脚手架时,控制器会创建各种方法,例如

新建、创建、显示、索引等

但在这里我无法理解新动作到创建动作的过渡

例如。当我单击新发布时,它会查找新操作,现在它呈现_form,但是在提交时如何将数据输入到该特定表中,控制器的创建操作在哪里调用以及如何?

我的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
4

3 回答 3

5

默认情况下在表单上搭建脚手架(阅读此处

当用户单击此表单上的 Create Post 按钮时,浏览器会将信息发送回控制器的创建操作(Rails 知道调用创建操作,因为表单是通过 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
于 2013-06-16T03:33:58.093 回答
1

这都是关于 HTTP 动词和路由的。

您的表单将对/posts路线发出 POST 请求。如果您使用 列出您的路线rake routes,您将看到对该特定路线的所有 POST 请求都被定向到或简称中的create操作。PostsControllerposts#create

于 2013-06-16T03:10:34.413 回答
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行动,因为那是你实际将帖子保存到数据库的地方。

于 2013-06-16T03:10:46.540 回答