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

时间:2015-01-15 10:50:38

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

我遵循Ryan Bates的教程,即Jquery文件上传,但示例只有1个模型。我试图为我的应用程序制作一个版本,serviceproviders has_many照片和照片属于service_viv。

这是我的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" 如何上传带有相关型号的照片。谢谢!


**

更新

**

我正在尝试为Serviceproviders创建一个清关照片库。例如,服务提供者有警察许可,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

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:0)

免责声明:此答案仅在您打算让new页面处理特定Clearance实例的单Serviceprovider

让我们澄清一下你得到错误的原因:Rails告诉你的是,你是否正在尝试为Clearance对象创建一个表单,但它并没有知道将创建POST请求发送到的位置(最终位于生成的action标记的<form>属性中的网址。)

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

resources :clearances, only: [:create]

我假设您已经在服务提供商中拥有嵌套路由&#39;显示新清关表格的路线。

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

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

首先,您的表单是使用Clearance.new构建的。 Clearance.new将返回一个新的,裸露的,没有对象的Clearance对象(可怜的!)。但是,您需要的是一个新对象,该对象属于您将clearances添加到Serviceprovider的{​​{1}}集合。

幸运的是,您已在控制器的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对象,该对象将与{ {1}}你想要的。

考虑到问题的内容,我能回答多远。我想你可以通过关注Ryan Bates&#39;来获取文件上传/保存权限。教程。如果没有,您需要添加有关您做了/不做什么以及实际失败的详细信息!

(PS:您绝对应该将Serviceprovider课程重命名为Serviceprovider) 的更新

ServiceProvider是显示您的表单和已上传图片的操作。 new是您提交表单时调用的操作。您想要的是,一旦添加许可,请返回create页面:将new移至redirect_to操作的末尾,而不是create