实施例,
我做了一个脚手架项目,
rails generate scaffold Post name:string title:string content:text
如果我去
localhost:3000/posts
它显示了这样的视图,
<h1>Listing posts</h1>
<table>
<tr>
<th>Name</th>
<th>Title</th>
<th>Content</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @posts.each do |post| %>
<tr>
<td><%= post.name %></td>
<td><%= post.title %></td>
<td><%= post.content %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Post', new_post_path %>
我的问题是关于link_to方法的第二个参数。
如果我看到html代码,它会在a标签中翻译这样的代码。
<a href="/posts/1">Show</a>
<a href="/posts/1/edit">Edit</a>
<a href="/posts/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>
<a href="/posts/new">New Post</a>
如何解析HTML代码?
我不明白第二个参数,比如post,edit_post_path,这种东西。
第二个问题。
当用户想要发布新帖子时,会转到此视图。
<%= form_for(@post) do |f| %>
<% if @post.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :content %><br />
<%= f.text_area :content %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
如果我查看表单标签,它会显示如下。
<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="5d3i4uFDrhq+qenAWLbBxWqaA6rJAKrPedVIO04NK6o="></div>
<div class="field">
<label for="post_name">Name</label><br>
<input id="post_name" name="post[name]" size="30" type="text">
</div>
<div class="field">
<label for="post_title">Title</label><br>
<input id="post_title" name="post[title]" size="30" type="text">
</div>
<div class="field">
<label for="post_content">Content</label><br>
<textarea cols="40" id="post_content" name="post[content]" rows="20"></textarea>
</div>
<div class="actions">
<input name="commit" type="submit" value="Create Post">
</div>
</form>
我的问题是,动作属性设置在哪里?
以及params如何发送给控制器?
在我的研究中,这是调用posts_controller的create方法。
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
如果是这样,如果我想调用此方法。这个动作不是必须发布/创建吗?
男人...... Rails对新手来说太难了,api doc太不方便了:(
答案 0 :(得分:1)
问题:&#34;我不理解第二个参数,比如post,edit_post_path,这种东西。&#34;
答案:edit_post_path
是编辑Post资源的途径。它将当前Post作为参数引用,以便它知道您要编辑哪个帖子。
Ruby on Rails为您的所有资源创建了静态路由,因此当您在Post模型周围生成脚手架时,您可以自动获得索引,编辑,显示和新路径。
您可能需要查看此Rails routing tutorial,这可以让您更好地了解路由的工作原理。
至于你的其他问题,你应该把它们分成不同的帖子,因为Tamer指出更适合StackOverflow的Q&amp; A格式。
答案 1 :(得分:1)
<td><%= link_to 'Show', post %></td>
此处,post
是一种资源,Rails根据其类型为资源生成URL。如果您致电link_to
并传递ActiveRecord
对象作为第二个参数,例如post
对象,则会查找show
的{{1}}网址类。
Post
同样,<td><%= link_to 'Edit', edit_post_path(post) %></td>
是您在edit_post_path
文件中放置resources :posts
时由Rails自动生成的方法。当您调用该方法时,它会返回用于编辑routes.rb
对象的URL。
销毁链接是一个略有不同的故事。在Rails中,您无法删除具有GET链接的资源。当您告诉post
要删除时,它实际上会在页面上创建一个提交删除请求的隐藏表单(这不是真正的DELETE请求,因为您无法从浏览器发出该请求;而是它是一个使用link_to
作为参数进行POST,当您单击呈现的链接时,框架JavaScript将提交该隐藏的表单。
键入method=_delete
以查看Rails根据rake routes
文件中的内容生成的所有路由,并按照建议阅读Rails路由以及REST。
关于你的第二个问题。
routes.rb
同样,这是一个REST的事情。 Rails会询问对象是否是新记录。如果是这样,它知道使用指向<%= form_for(@post) do |f| %>
操作的form
方法呈现post
标记;否则,它将使用index
方法呈现form
标记,该方法指向对象的URL。