【问题标题】:Jquery file upload with two model associated in railsJquery文件上传与rails中关联的两个模型
【发布时间】:2015-01-15 10:50:38
【问题描述】:

我按照 Ryan Bates 的教程上传 Jquery 文件,但示例只有 1 个模型。我试图为我的应用程序制作一个版本,服务提供者有_许多照片和照片属于_服务提供者。

这是我的 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

我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    resources :clearances, only: [:create]
    

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

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

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

    首先,您的表单是使用Clearance.new 构建的。 Clearance.new 将返回一个新的、赤裸的、不承认的 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 的教程正确上传/保存了文件。如果没有,您需要添加有关您做了/未做的事情以及实际失败的细节!

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

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

    【讨论】:

    • 非常感谢@OlivierLance .. 我明白了,但现在我有一个问题,如何显示上传的每张照片。我在这里有我的新方法@serviceprovider = Serviceprovider.find(params[:serviceprovider_id]) @clearance = @serviceprovider.clearances.new @clearances = @serviceprovider.clearances,所以每次我上传它时也会显示,但我得到一个错误 undefined avatar_url。但我也担心我的解决方案真的有效吗?
    • @JuanDelaCruz 我没有足够的信息来回复这个...您应该更新您的问题,详细说明您使用什么来管理上传的文件以及您想要实现什么。
    • 查看我的更新答案!如果您在进入 new 页面后无法显示图像,我建议您接受我的回答以关闭此问题并创建一个新问题来描述您的新问题。
    • 好的@OlivierLance..我会为此创建一个新线程。顺便说一句,感谢您的帮助,您的更新解决方案也没有奏效,但我将在下一个线程中发布完整的详细信息,以便您了解内部发生的情况。再次感谢您。
    • 不客气!把你的新问题的链接放在这里,我会看看:)如果它解决了你的问题,你能接受我的回答吗? meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多