`
jiajie0531
  • 浏览: 27464 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

rails4 5.11 Updating Articles

 
阅读更多

我们已经完成了CRUD中的“CR”部分了。现在让我们关注“U”这部分,更新articles。

 

第一步我将要做的是,在ArticlesController中增加一个action edit。

defedit

@article= Article.find(params[:id])

end

这个视图将会包含一个form,类似于我们用过的那个,在我们创建新的articles的时候。创建一个文件app/views/articles/edit.html.erb,编辑如下:

<h1>Editing article</h1>

 

<%= form_for :article, url: article_path(@article), method: :patch do |f| %>

<% if @article.errors.any? %>

<div id="error_explanation">

<h2><%= pluralize(@article.errors.count, "error") %> prohibited

this article from being saved:</h2>

<ul>

<% @article.errors.full_messages.each do |msg| %>

<li><%= msg %></li>

<% end %>

</ul>

</div>

<% end %>

<p>

<%= f.label :title %><br>

<%= f.text_field :title %>

</p>

 

<p>

<%= f.label :text %><br>

<%= f.text_area :text %>

</p>

 

<p>

<%= f.submit %>

</p>

<% end %>

 

<%= link_to 'Back', articles_path %>

此刻,我们把这个form定位到action update,其还没有被定义, 但接下来就会被实现的

method: :patch这个属性告知Rails,我们想让这个form通过PATCH HTTP方法来提交,HTTP方法就是你所期待的用来update资源,通过REST协议。

form_tag中的第一个参数是一个对象,@article,会引起helper帮助在form中填充对象的字段。用相同的名字来传入一个标签(:article),正如这个实例变量(@article)神奇地指向相同的行为。这就是现在发生的。更多的细节可以在参考form_for documentation.

接下里,我们需要创建action update,在这个文件里app/controllers/articles_controller.rb:

defupdate

@article= Article.find(params[:id])

 

if@article.update(article_params)

redirect_to @article

else

render 'edit'

end

end

 

private

defarticle_params

params.require(:article).permit(:title, :text)

end

当你想要修改一条已存在的记录时,新的方法update会被使用,它接收一个hash,里面包含了你想要更新的那些特性。比如放在以前,如果在更新article时有个错误,我们会返回form,显示错误信息给用户看。

我们复用方法 article_params,这个我们前面在action create的时候已经定义过了。

information:你不需要为了更新而传入所有参数。比如,如果你调用了@article.update(title: ‘A new title’), Rails将仅仅更新特性title,不处理其他的特性。

最后,在罗列所用的articles中,我们想要显示一个链接到action edit,因此让我们现在来增加吧,app/views/articles/index.html.erb 在这里显示链接“Show”:

<table>

<tr>

<th>Title</th>

<th>Text</th>

<th colspan="2"></th>

</tr>

 

<% @articles.each do |article| %>

<tr>

<td><%= article.title %></td>

<td><%= article.text %></td>

<td><%= link_to 'Show', article_path(article) %></td>

<td><%= link_to 'Edit', edit_article_path(article) %></td>

</tr>

<% end %>

</table>

同样的,在文件app/views/articles/show.html.erb 中,我们也会增加链接,因此在article的页面也会有一个“Edit”的链接。在模板的底部增加这个链接:

...

 

<%= link_to 'Back', articles_path %>

| <%= link_to 'Edit', edit_article_path(@article) %>

下面就是我们的程序看上去的效果:

原文:http://guides.rubyonrails.org/getting_started.html

--end

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics