2017-03-04 104 views
0

我有一個div在父視圖中呈現show部分。在這show部分,我有一個按鈕,應該改變父母的部分呈現'表單'部分編輯對象,但我不斷收斂,因爲它似乎'表單'部分的form_for缺少@project對象。如何渲染一個包含form_for編輯功能的部分?

如何將此對象傳遞給「表單」部分?我錯過了別的嗎?

我對使用AJAX很新穎。如果您需要,歡迎提供更多信息。

我在服務器端得到的錯誤是

ActionView::Template::Error (First argument in form cannot contain nil or be empty): 

的routes.rb

get 'switchProjectView', to: 'projects#switch_main_view' 
    resources :projects 

projects_controller.rb

class ProjectsController < ApplicationController 

    def new 
    @project = Project.new 
    end 

    def create 
    @project = Project.new(project_params) 
    if @project.save 
     flash[:success] = "New Project Added" 
     redirect_to @project 
    else 
     flash[:danger] = "Project Not Added. Please Try Again" 
    end 

    end 

    def show 
    @project = Project.find(params[:id]) 
    end 

    def index 
    @projects = Project.all 
    end 

    def update 
    @project = Project.find(params[:id]) 
    if @project.update_attributes(project_params) 
     redirect_to @project 
    else 
     render 'edit' 
    end 
    end 

    def edit 

    end 

    def switch_main_view 
    respond_to do |format|    
     format.html 
     format.js 
    end  
    end  


    def project_params 
    params.require(:project).permit(:main_contact_name, :id, :main_contact_phone, :main_contact_email, :project_name) 
    end 

end 

SH ow.html.erb

<div class="body"> 
     <div class="center jumbotron heading-jumbo"> 
     <h1><%= @project.project_name %></h1> 
     </div> 

     <div class="body-jumbo jumbotron" id='project-details'> 
     <%= render "projects/show" %> 
     </div> 
    </div> 

switch_main_view.js.erb

$('#project-details').html("<%= j render :partial => 'projects/form' %>"); 

_form.html.erb

<%= form_for(@project) do |f| %> 

     <%= f.label :project_name %> 
     <%= f.text_field :project_name, class: 'form-control'%> 

     <%= f.label :main_contact_name %> 
     <%= f.text_field :main_contact_name, class: 'form-control'%> 

     <%= f.label :main_contact_phone %> 
     <%= f.text_field :main_contact_phone, class: 'form-control'%> 

     <%= f.label :main_contact_email %> 
     <%= f.text_field :main_contact_email, class: 'form-control'%> 

     <%= f.submit 'Save Project', class: 'btn btn-primary'%> 

    <% end %> 

_show.html.erb

<div class='text-center center'> 
    <h3><strong>Project Information</strong></h2> 
</div> 
<h2>Start Date: Launch Date:</h1> 
<span class='pull-right jumbo-btn-span'><%= link_to "Edit Project Information", switchProjectView_path(@project), remote: true, class:'btn btn-primary jumbo-btn' %></span> 
<h2>Primary Conact's Name: <%= @project.main_contact_name %></h2> 
<h2>Primary Conact's Phone: <%= @project.main_contact_phone %></h2> 
<h2>Primary Conact's Email: <%= @project.main_contact_email %></h2> 
+0

你在控制器中聲明@project的主要觀點? – gwalshington

+0

是的,我有。父項目show.html.erb上的項目/部分顯示正確顯示@project數據 – got2jam

+0

問題是,ruby變量隨頁面呈現,而瀏覽器在添加部分時不記得它。如果它已經聲明,你有沒有想過隱藏div,但加載頁面,然後在需要時顯示它,而不是稍後添加html? – gwalshington

回答

1

您的請求「switchProjectView_path(@project)」僅將對象ID發送到服務器,因此您需要加載對象以將其呈現在視圖中以進行響應。
1.首先路徑應該是這樣的,這樣的網址可能包含對象ID:
get 'switchProjectView/:id', to: 'projects#switch_main_view', as:"switchProjectView"
2.您必須加載對象控制器: def switch_main_view @project = Project.find(params[:id]) respond_to do |format| format.html format.js end end

+0

這完成了伎倆。我能夠呈現查找和呈現@project使用params/controller方法的對象。謝謝 – got2jam

0

嘗試調用部分時傳遞變量:

$('#project-details').html("<%= j render :partial => 'projects/form', locals: {project: @project} %>"); 
+0

仍然沒有:-( FWIW,部分呈現時,當它沒有變量。 – got2jam

2

嘛,每個請求,您需要重新初始化控制器方法的變量。在你的情況,你需要做到以下幾點:

def switch_main_view 
    @project = Project.new 
    respond_to do |format|    
    format.html 
    format.js 
    end  
end 

這樣做將使你擺脫錯誤的:在形式第一個參數不能包含零或爲空,但不會讓你去做你實際想做的事情。

當您使用link_to,默認情況下它會爲一個HTML請求,你可以在Rails的日誌中看到,像下面會出現:

Processing by ProjectsController#switch_main_view as HTML 

爲了讓JS響應,需要告知link_to那你是爲一個JS反應,而不是一個HTML的響應,並且您可以通過在link_to傳遞format: :js喜歡做的事:

<%= link_to "Edit Project Information", switchProjectView_path(@project, format: :js), remote: true, class:'btn btn-primary jumbo-btn' %></span> 

remote: true會在那裏,以確保你不重裝在頁面的內容,而你正試圖從後臺獲取服務器的東西。