Rails link_to和f.submit参数

时间:2013-11-18 02:28:10

标签: ruby-on-rails

实施例,

我做了一个脚手架项目,

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太不方便了:(

2 个答案:

答案 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。