https://guides.rubyonrails.org/form_helpers.html

6 Uploading Files

一个常见的任务是上传某种文件,无论是人的照片还是包含要处理的数据的 CSV 文件。  文件上传字段可以使用 file_field 帮助器呈现。

前端进行表单的书写:

<%= form_with model: @person do |form| %>
  <%= form.file_field :picture %>
<% end %>
<%= form_with url: "/uploads", multipart: true do |form| %>
  <%= file_field_tag :picture %>
<% end %>

后端进行方法的实现:

def upload
  uploaded_file = params[:picture]
  File.open(Rails.root.join('public', 'uploads', uploaded_file.original_filename), 'wb') do |file|
    file.write(uploaded_file.read)
  end
end

您会注意到 HTML 包含一个类型为 hidden 的 input 元素。  这个输入很重要,因为没有它就无法成功提交非 GET 表单。  名为authenticity_token 的隐藏输入元素是Rails 的一项安全功能,称为跨站点请求伪造保护,表单助手会为每个非GET 表单生成它(前提是启用了此安全功能)。  您可以在 Securing Rails Applications 指南中阅读更多相关信息。

<%= form_with do |form| %>
  Form contents
<% end %>

浏览器结果:

<form accept-charset="UTF-8" action="/" method="post">
  <input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
  Form contents
</form>

复选框是表单控件,为用户提供了一组可以启用或禁用的选项:

<%= form.check_box :pet_dog %>
<%= form.label :pet_dog, "I own a dog" %>
<%= form.check_box :pet_cat %>
<%= form.label :pet_cat, "I own a cat" %>

generates:

<input type="checkbox" id="pet_dog" name="pet_dog" value="1" />
<label for="pet_dog">I own a dog</label>
<input type="checkbox" id="pet_cat" name="pet_cat" value="1" />
<label for="pet_cat">I own a cat</label>

单选按钮:

<%= form.radio_button :age, "child" %>
<%= form.label :age_child, "I am younger than 21" %>
<%= form.radio_button :age, "adult" %>
<%= form.label :age_adult, "I am over 21" %>

output:

<input type="radio" id="age_child" name="age" value="child" />
<label for="age_child">I am younger than 21</label>
<input type="radio" id="age_adult" name="age" value="adult" />
<label for="age_adult">I am over 21</label>

others:

<p43>
<figure class="highlight"><pre><code class="language-html" data-lang="html"><span class="ni">&amp;lt;</span>%= form.text_area :message, size: <span class="ni">&amp;quot;</span>70x5<span class="ni">&amp;quot;</span> %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.hidden_field :parent_id, value: <span class="ni">&amp;quot;</span>foo<span class="ni">&amp;quot;</span> %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.password_field :password %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.number_field :price, in: 1.0..20.0, step: 0.5 %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.range_field :discount, in: 1..100 %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.date_field :born_on %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.time_field :started_at %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.datetime_local_field :graduation_day %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.month_field :birthday_month %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.week_field :birthday_week %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.search_field :name %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.email_field :address %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.telephone_field :phone %<span class="ni">&amp;gt;</span>
<span class="ni">&amp;lt;</span>%= form.url_field :homepage %<span class="ni">&amp;gt;</span></code></pre></figure>
</p43><p43>

<figure class="highlight"><pre><code class="language-html" data-lang="html"><span class="ni">&amp;lt;</span>%= form.color_field :favorite_color %<span class="ni">&amp;gt;</span></code></pre></figure>
</p43>
<code class="highlight erb">area: <span class="cp">&lt;%=</span> <span class="n">form</span><span class="p">.</span><span class="nf">text_area</span> <span class="ss">:body</span><span class="p">,</span> <span class="ss">size: </span><span class="s2">&quot;60x10&quot;</span> <span class="cp">%&gt;</span>

select:<%= form.select :city, ["Berlin", "Chicago", "Madrid"] %>

我们还可以指定与标签不同的 <option> 值:

<%= form.select :city, [["Berlin", "BE"], ["Chicago", "CHI"], ["Madrid", "MD"]] %>

output:

&lt;select name=&quot;city&quot; id=&quot;city&quot;&gt;<br />
&nbsp; &lt;option value=&quot;BE&quot;&gt;Berlin&lt;/option&gt;<br />
&nbsp; &lt;option value=&quot;CHI&quot;&gt;Chicago&lt;/option&gt;<br />
&nbsp; &lt;option value=&quot;MD&quot;&gt;Madrid&lt;/option&gt;<br />
&lt;/select&gt;