2012-11-16 30 views
0

我最近要求幫助重新排序檢查boxs列表的順序顯示,Ruby on Rails: re-order checkbox tagRuby on Rails的:錯誤信息沒有因爲改變一個列表

我找到了一個很好的答案,並走了,改變了我的代碼。由此看來,

<div class="tech" STYLE="text-align: left;"> 
    <b>Technologies:</b> 
    <style> 
    .split { text-align:left; } 
    </style> 


    <p><ul> 

    <% for technol in Technol.all %> 
    <li class="split"> 
    <%= check_box_tag "project[technol_ids][]", technol.id, @project.technols.include?(technol) %> 
    <%= technol.tech %> 
    </li> 

    <% end %> 
</ul> 
</p> 

此,

<div class="tech" STYLE="text-align: left;"> 
<b>Technologies:</b> 
<style> 
    .split { text-align:left; } 
</style> 


<p><ul> 

<% @all_technols.each do |technol| %> 



<li class="split"> 
<%= check_box_tag "project[technol_ids][]", technol.id, @project.technols.include?(technol) %> 
<%= technol.tech %> 
</li> 

<% end %> 
</ul> 
</p> 

與項目負責人新的行動看起來像這樣:

def new 
    @project = Project.new 
     @technol = Technol.new(params[:tech]) 

     @all_technols = Technol.order('tech ASC') 

     tech_ids = params[:technols][:id].reject(&:blank?) unless params[:technols].nil? 


     @project_technol = @project.projecttechnols.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @project } 
    end 
    end 

我現在已經注意到,如果用戶輸入一個新的項目,和一個validates_presence_ofvalidates_format_of標記在我的代碼中,錯誤消息不顯示,而是我得到一個錯誤消息:

NoMethodError in Projects#create 
line #256 raised: 
undefined method `each' for nil:NilClass 

Extracted source (around line #256): 
253: 
254: <p><ul> 
255: 
256: <% @all_technols.each do |technol| %> 
257: 
258: 
259: 

它必須與重新排序技術有關,但我似乎無法找到解決辦法。希望有人能看到我要出錯的地方。提前致謝。

編輯

def create 
    @project = Project.new(params[:project]) 
     @project.client = params[:new_client] unless params[:new_client].blank? 
     @project.role = params[:new_role] unless params[:new_role].blank? 
     @project.industry = params[:new_industry] unless params[:new_industry].blank? 
     @project.business_div = params[:new_business_div] unless params[:new_business_div].blank? 


if !params[:technols].nil? 

      params[:technols][:id].each do |tech| 

       if !tech.empty? 

        @project_technol = @project.projecttechnols.build(:technol_id => tech) 

       end 
      end 

end 

    respond_to do |format| 
     if @project.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render json: @project, status: :created, location: @project } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

回答

3

在控制器的create方法,或什麼是處理您提交的動作的名稱,請確保您渲染new視圖之前再次填充@all_technols,否則你」會得到這個錯誤!

所以在create採取行動,例如:

else 

    format.html { @all_technols = Technol.order('tech ASC'); render action: "new" } 
    format.json { render json: @project.errors, status: :unprocessable_entity } 
end 
+0

我已經加入我的'create'行動,我的問題。我不明白爲什麼之前它會工作,但添加代碼來改變順序會影響它? – Jazz

+1

因爲之前,您直接在視圖中查詢數據庫的'Technol.all',所以沒有中間變量。現在你有一個名爲'@ all_technols'的實體,你可以從控制器實例化它。所以你必須確保在渲染視圖之前實例化它 –

+0

謝謝。這是問題所在。 – Jazz