Jquery 文件上传与 rails 中关联的两个模型

Jquery file upload with two model associated in rails

我遵循 Ryan Bates 的教程 Jquery 文件上传,但示例只有 1 个模型。我试图为我的应用程序制作一个版本,其中 serviceproviders has_many photos 和 photos belongs_to serviceprovider.

这是我的new.html.erb

<h1>Add a Clearance</h1>

<%= form_for Clearance.new do |f| %>
    <%= f.label :avatar, "Clearances" %>
    <%= f.file_field :avatar, multiple: true, name: "clearance[avatar]" %> 
<% end %>

清关控制器

def new @serviceprovider = Serviceprovider.find(params[:serviceprovider_id] @clearance = @serviceprovider.clearances.new end

def create
    @clearance = Clearance.create(clearance_params)
end

我得到一个错误undefined method "clearances_path" 如何上传带有关联模型的照片。谢谢!


**

更新

**

我正在尝试为服务提供商创建许可照片画廊。例如,服务提供者拥有警方许可、NBI 许可以及任何可能表明他没有任何刑事案件的许可。现在我可以使用 jquery-fileupload 上传照片(感谢@OlivierLance 帮助我)但现在我希望每次上传照片时它都会自动显示。我是 rails 的新手,我很难学习一些精华,因为正如我所说,我对 rails 不熟悉。我已经解决了我将重新加载页面的解决方案,以便它会在我每次上传时显示但什么也没有发生。该页面有一个无限循环重定向页面。

def new
        @serviceprovider = Serviceprovider.find(params[:serviceprovider_id])
        @clearance = @serviceprovider.clearances.new

        @clearances = @serviceprovider.clearances
                redirect_to new_serviceprovider_clearance_url(@serviceprovider)
        end
    end 

def create
    @serviceprovider = Serviceprovider.find(params[:clearance][:serviceprovider_id])
    @clearance = @serviceprovider.clearances.create(clearance_params)
end

我怎样才能做到这一点?

免责声明:仅当您打算让 new 页面处理对特定 Serviceprovider 实例的单个 Clearance 添加时,此答案才有效

让我们来澄清您收到错误的原因:Rails 告诉您的是,您正在尝试为 Clearance 对象创建一个表单,但它不知道在哪里将创建 POST 请求发送到(URL,最终会出现在生成的 <form> 标签的 action 属性中)。

您必须为 Rails 添加路由,以将 URL 与您的 ClearancesController 的操作相匹配。您应该在 routes.rb 文件中添加的最少内容是:

resources :clearances, only: [:create]

我假设您在服务提供商的路线中已经有一个嵌套路线来显示新的清关表格。

这个新路由将创建一个新的路由助手,clearances_path,如 Rails routing guide 中所述。
现在这条路线已经存在,Rails 将能够为新的 Clearance 对象生成表单。

但是,您需要对当前代码应用一些修复。

首先,您的表单是使用 Clearance.new 构建的。 Clearance.new 将 return 一个新的、赤裸裸的、被拒绝的 Clearance 对象(可怜的对象!)。不过,您需要的是一个新对象,该对象属于您要将其添加到的 Serviceproviderclearances 集合。

幸运的是,您已经在控制器的 new 操作中创建了其中之一。为什么不使用它? :)

# new.html.erb
<h1>Add a Clearance</h1>

<%= form_for @clearance do |f| %>
    <%= f.hidden_field :serviceprovider_id %>
    <%= f.label :avatar, "Clearances" %>
    <%= f.file_field :avatar, multiple: true, name: "clearance[avatar]" %> 
<% end %>

为什么这很重要?好吧,因为此 Clearance 对象已使用非空 serviceprovider_id 初始化(假设这是您的外键名称)。请注意,我添加了一个隐藏字段,用于在表单中保存此 ID。

所有这些都准备就绪后,当您提交表单时,它将转到您的 create 操作并在您的数据库中创建一个新的 Clearance 对象,该对象将正确关联到 Serviceprovider你想要的。

考虑到你的问题内容,​​我只能回答到此为止。我猜你按照 Ryan Bates 的教程正确地获得了文件 upload/saving。如果没有,您需要添加详细信息,说明您 did/did 没有做什么以及那里实际失败的地方!

(PS: 你绝对应该将 Serviceprovider class 重命名为 ServiceProvider) 更新

new 是将显示您的表单和已上传图片的操作。 create 是提交表单时调用的操作。你想要的是在添加许可后返回 new 页面:将你的 redirect_to 移动到 create 操作的末尾而不是 new.