【问题标题】:Rails 3.0 - form_for and fields outside of the current modelRails 3.0 - form_for 和当前模型之外的字段
【发布时间】:2011-08-24 12:28:32
【问题描述】:

当我向 Rails 3.0 照片库网站提交照片时。除了能够上传文件,从下拉列表中选择相册,我还需要能够传递逗号分隔标签列表。我对正确使用 form_for 感到困惑。注意:这是在 new.html.erb 视图中(和 PhotoController 的新方法)

<%= form_for(@photo) do |f| %>
  <% if @photo.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@photo.errors.count, "error") %> prohibited this photo from being saved:</h2>

      <ul>
      <% @photo.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

    <%= f.label :album_id %>
    <%= select "photo", "album_id", @albums.map {|a| [a.name,a.id]} %><br />

    <%= f.label :name %>
    <%= f.text_field :name %><br />

    <%= f.label :photofile %>
    <%= f.file_field :photofile %><br />

    <%= f.label :tags %>
    <%= f.text_field :tags %><br />

   <%= f.submit %>
<% end %>

我对 (1) 上传文件的正确方法感到困惑 - 我是否使用 f.file_field 沿着正确的路径前进。 photofile 并不是 Photo 对象的真正属性。并且(2)与 :tags 类似的问题 - 标签不是 Photo 对象上的属性,所以它应该是 f.text_field (3)我假设我做相册下拉列表的方式是正确的(我希望?)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 erb


    【解决方案1】:

    请记住,您可以在 form_for 中创建任何字段,就像任何其他表单一样。

    for 的表单通过生成名称为 photo[name] 的字段来帮助您 但您可以使用text_field_tag :tags 并在控制器上使用params[:tags] 毫无问题地检索它。

    如果该字段不是来自您的模型,则不应使用 f.&lt;helper&gt;,只需使用适合您的数据的另一个帮助器,例如 text_field_tag,如果您愿意,甚至可以使用纯 html。

    【讨论】:

    • 在这两种情况下都应该使用 f.label 吗?或者如果不在模型中,总是避免?
    • 例如,如果您使用f.label :tags,它将使用for="photo_tags" 创建一个标签,但如果您使用label_tag :tags,它将使用for="tags" 创建一个标签。 f. 尝试使表单元素适应f 中的对象,所以是的,如果它不在对象中,请在没有f. 的情况下创建它:)
    【解决方案2】:

    首先,您需要在 form_for 调用中说 :multipart => true 。这表示表单具有附件。然后,对于附件,使用像 paperclipcarrierwave 这样的 gem。查看这些 railscasts 以获得关于如何使用 paperclipcarrierwave 的精彩介绍。

    标记this railscast 是一个有用的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多