我正在学习Rails并且正在编写经典博客应用程序。
def update
@article = Article.find(params[:id])
@article.update(article_params)
flash.notice = "Article '#{@article.title}' updated!"
redirect_to article_path(@article)
end
params[:id]
方法如何使用update
?我的form_for
只是传递了@article
对象:
def edit
@article = Article.find(params[:id])
end
从http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object开始,表单将POST到的网址为/articles/create
。它似乎没有查询字符串,因此id
似乎不会通过GET发送。根据我的理解,params[:articles]
是通过POST传递的全部内容。那么params[:id]
行动的update
怎么可用?
答案 0 :(得分:1)
update
是PUT
,构建的网址是/articles/1
create
是POST
,构建的网址是/articles
这就是文档中的内容。
现在,您可以在id
中看到update
参数的来源,是的,create
没有ID:)
答案 1 :(得分:0)
@article = Article.find(params[:id])
返回的文章实例包括文章的ID和数据库中的所有字段。
然后(我猜你有形式)解析实例并显示模型中的所有字段。
然后当你按下提交时,它会将散列中的所有更改传递给更新方法(浏览器中的PUT方法)。
希望回答你的问题。
答案 2 :(得分:0)
通过rails路由器进行更新。阅读this。如果你查看你的应用程序的config / routes.rb,你会发现这样的东西:
resources :articles
如果您在应用程序中运行rake路由任务,它将返回类似于:
的内容 articles GET /articles(.:format) articles#index
POST /articles(.:format) articles#create
new_article GET /articles/new(.:format) articles#new
edit_article GET /articles/:id/edit(.:format) articles#edit
article GET /articles/:id(.:format) articles#show
PATCH /articles/:id(.:format) articles#update
PUT /articles/:id(.:format) articles#update
DELETE /articles/:id(.:format) articles#destroy
所以这是RESTful资源映射HTTP动词的方式。因此,当您创建文章时,没有:id,因为显然您将从DB自动增量计数器获取它。当您更新它时,您已经拥有id并将您的请求路由到带有HTTP PUT请求的/ articles /:id。并且:id存在可在控制器操作中使用的查询参数。