代码之家  ›  专栏  ›  技术社区  ›  gcstr

带form_tag的回形针,无相应型号

  •  1
  • gcstr  · 技术社区  · 9 年前

    我有一个带图片的表格要上传,但这个表格不是直接建立在模型上的,我正在使用 form_tag 而不是 form_for .

    我想上传图片并用回形针保存,但我如何让回形针理解表单中的参数?

    @user.avatar.picture = params[:my_file_field]

    2 回复  |  直到 9 年前
        1
  •  2
  •   Richard Peck    9 年前

    为了纠正你的一些术语,回形针 附加到模型,否则您将无法保存所拥有的文件。

    您遇到的问题是,您试图填充一个与您的路由结构(IE)不对应的模型 只有 图片属性,需要一种用回形针解析的方法)。

    你仍然有一个控制器/动作&要填充的模型。。。


    #config/routes.rb
    resources :users, path: "profile", only: [:index] do 
       patch :avatar, on: :member #-> url.com/profile/:id/avatar
    end
    
    #app/controllers/users_controller.rb
    class UsersController < ApplicationController
       def avatar
           @user = User.find params[:id]
           @user.update avatar_params
       end
    
       private
    
       def avatar_params
           params.require(:user).permit(avatar_attributes: [:picture])
       end
    end
    
    #app/views/users/show.html.erb
    <%= form_for @user, url: user_avatar_path(@user) do %>
       <%= f.fields_for :avatar do |a| %>
          <%= a.file_field :picture %>
       <% end %>
       <%= submit_tag %>
    <% end %>
    

    --

    如果你想坚持 form_tag ,您需要剪切模型级参数:

    #config/routes.rb
    resources :users, path: "profile", only: [:index] do
       patch :avatar, on: :member
    end
    
    #app/controllers/users_controller.rb
    class UsersController < ApplicationController
       def avatar
          @user = User.find params[:id]
          @user.avatar.update avatar_params
       end
    
       private
    
       def avatar_params
          params.permit(:picture)
       end
    end
    
    #app/views/users/show.html.erb
    <%= form_tag users_avatar_path(@user) do %>
       <%= file_field_tag :picture %>
       <%= submit_tag %>
    <% end %>
    

    几个指针:

    1. 表单标记(_T) 不会显示错误
    2. 你的 file_field 需要与您的 paperclip 附件
        2
  •  1
  •   Chetan    9 年前

    你能更详细地描述一下这个问题吗。据我所知,你对form_tag有问题

    如果您使用的是form_tag,那么应该使用正确的form_tag格式。

    form_tag(controller: "people", action: "search", method: "get", class: "nifty_form")
    

    例如,你必须这样做

    <%= form_tag :controller => 'images', :action => 'create', :method => "get", :multipart => true do %>