2017-03-14 89 views
0

我一直被困在這最後幾天,無法找到答案。Rails渲染另一模型的模態 - 路由或JavaScript問題?

我有一個調用template_modal表單的配置文件表單。配置文件可以使用template_modal每次上傳多個模板。

模態顯示,但按下提交後,它重定向到profiles_controller#創建時它應該是templates_controller#創建,所以如何將模板保存到數據庫?如果這是一個小調整,請讓我知道。預期的行爲是保存模板並在profile-form上使用AJAX顯示。

SO和博客上的所有示例都有一個模型模型,並且未解決2個控制器的這個問題。

我不確定是否路由問題與路由決定了控制器。實際上,Template模型也具有非模態形式,但我已經在模板視圖中分別爲模態和非模態形式命名了部分。從技術上講,創建非模態模板時,路徑顯示爲:user/1/templates/new,現在通過渲染模態,我已經在profile/new上,它渲染另一個模型的模態,因此會對要訪問哪個控制器的創建動作感到困惑。

我從here拿起代碼片段:

這裏是代碼:

profiles_controller - 它呈現template_modal

<%= bootstrap_form_for @profile do |f| %> 
    #Some fields of profile form 
    <%= link_to "Add Template", new_user_company_template_path(current_user), remote: true, class: "btn btn-primary", 'data-toggle' => 'modal' %> 

     <div id="template-modal" class="modal fade"></div> 

     <table class='table' id='template_table'> 
      <thead> 
      <tr> 
      <th>Name</th> 
      <th>Template</th> 
      <th> View </th> 
      <th> Delete </th> 
      </tr> 
      </thead> 
      <tbody class="template-index"> 
      <% @company_templates.each do |co_template| %> 
       <%= render "company_templates/list", locals: {company_templates: @company_templates} %> 
      <% end %> 
      </tbody> 
     </table> 
    <% end %> 

的意見/ company_templates/_list.html.erb

<% @company_templates.each do |co_template| %> 
<tr> 
    <td><%= co_template.name %></td> 
    <td><%= co_template.template.file.basename %></td> 
    <td><%= link_to 'Download', co_template %></td> 
    <td><%= link_to 'Delete', co_template, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
</tr> 

個視圖/ company_templates/new.js.erb

​​

視圖/ company_templates/_form_modal.html.erb

<div class="modal-dialog" id="new_template_modal"> 
    <div class="modal-content"> 
    <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
     <h4 class="modal-title" id="myModalLabel"> Add New Template </h4> 
    </div> 
    <%= form_for [current_user, CompanyTemplate.new], :url => url_for(:controller => 'company_templates', :action => 'create', params: {id: current_user.id}), remote: true, html: { style: "display:inline;" } do |f| %> 
     <div class="modal-body"> 
      <ul class="errors"></ul> 

      <%= f.hidden_field :company_id, :value => params[:user_id] %> 
      <div class="form-group"> 
      <%= f.label :" Template Name ", class:"control-label" %> 
      <%= f.text_field :name, class: "form-control" %> 
      </div> 
      <div class="form-group"> 
      <%= f.label :"Upload template", class: "control-label" %> 
      <%= f.file_field :template, class: "form-control" %> 
      <small>(File Restrictions: Only allowed - '.doc', '.docx', '.txt', '.rtf' & '.pdf' less than 2MB).</small> 
      </div> 
     </div> 
     <div class="modal-footer"> 
      <%= f.submit "Submit Template", class: "btn btn-primary" %> 
      <%= link_to "Cancel", "#", class: "btn", data: {dismiss: "modal"} %> 
     </div> 
    <% end %> 
    </div> 
</div> 

company_templates_controller.rb

def create 
    @company_templates = current_user.company_templates.all.order(created_at: "DESC") 
@company_template = CompanyTemplate.new(company_template_params) 

     respond_to do |format| 
     if @company_template.save 
      format.html { redirect_to @company_template, alert: 'The template was successfully created.' } 
      format.json { render action: 'show', status: :created, location: @company_template } 
      format.js { render 'save', status: :created, location: @company_template } 
     else 
      format.html { render action: 'new', alert: 'Problem uploading CV.Check if the file is one of .doc/.docx/.pdf type & less than 2MB).'} 
      format.json { render json: @company_template.errors, status: :unprocessable_entity } 
      # added: 
      format.js { render json: @company_template.errors, status: :unprocessable_entity } 
     end 
     end 

視圖/ company_templates/_save.js .erb

$("ul.errors").html("") 
<% if @company_template.errors.any? %> 
    <% @company_template.errors.full_messages.each do |message| %> 
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>")) 
    <% end %> 
<% else %> 
    $(".template-index").html("<%= escape_javascript(render partial: 'list', locals: {co_template: @company_template }) %>") 
    $("#new_template-modal").modal("hide"); 

    $('#template_table').append("<%= j render partial: 'list', locals: {co_template: @company_template } %>"); 
    $('#new_template_modal').modal("hide"); 
<% end %> 

請告訴我我做錯了什麼?謝謝。

+0

沒有進入細節,但你肯定不會渲染另一個表單中的表單? – Mandeep

+0

Thx Mandeep。我沒有得到你的意思....一個模態對話框是從主要形式呈現的配置文件。該模式打開所有領域,但按模態的提交它提交主表格 - 配置文件。 – Means

+0

你正在注入new_modal裏面的##template-modal *元素,它在你的個人資料表單中,因此是另一個表單裏面的一個表格 – Mandeep

回答

1

嘗試

#views/company_templates/new.js.erb 
$("#template-modal").remove(); 
$("body").html("<%=j render 'new_modal' %>"); 
$("#template-modal").modal("show"); 
+0

好吧,它到了templates_controller /#create。但它是說無效的真實性令牌如何解決? – Means

+0

許多Thx @Mandeep。我通過[this]解決了authenticity_token(http://stackoverflow.com/questions/24319353/ruby-form-using-ajax-with-remote-true-gives-actioncontrollerinvalidauthentici)。但現在如何重新導向到profile/new而不刷新? – Means