2014-05-02 45 views
1

Ruby on Rails 4form_for submiting other submits

我的表單是編輯表格證書。該表格根據出席和傳遞屬性顯示用戶。我有一個按鈕,用於通過和/或參加更新證書表。

現在它正在運行參加和通過,當我只想每次更新一個單獨。我可以用@training/@ passed/@ untrained/@ unpassed放置什麼,使它只運行與實例變量的f.submit關聯的代碼。

所以if form_for @passed提交提交只運行if @passed。像if @passed.nil? == false或者有沒有辦法用form_for發送ID?

我的表格:

<%= form_for @untrained, :url => certificates_path(@untrained) do |f| %> 
    <p> Trained Users </p> 
    <%= select_tag "certificate[user_id]", options_for_select(@current_trained.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %> 
    <%= f.submit "Un-Train", class: "btn btn-large btn-primary" %> 
<% end %> 


<%= form_for @trained, :url => certificates_path, :method => :post do |f| %> 
    <p> Non-Trained Users </p> 
    <%= select_tag "certificate[user_id]", options_for_select(@non_trained.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %> 
    <%= f.submit "Train", class: "btn btn-large btn-primary" %> 
<% end %> 

<%= form_for @unpassed, :url => certificates_path(@unpassed) do |f| %> 
    <p> Certified Users </p> 
    <%= select_tag "certificate[user_id]", options_for_select(@current_passed.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %> 
    <%= f.submit "Un-Certify", class: "btn btn-large btn-primary" %> 
<% end %> 


<%= form_for @passed, :url => certificates_path, :method => :post do |f| %> 
    <p> Non-Certified Users </p> 
    <%= select_tag "certificate[user_id]", options_for_select(@non_passed.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %> 
    <%= f.submit "Certify", class: "btn btn-large btn-primary" %> 
<% end %> 

控制器:

def create 
if @trained = Certificate.where(user_id: params[:certificate][:user_id]).first 
    @trained.update_attributes(attend: "Yes") 
else 
    @trained = Certificate.new(params[:certificate]) 
    if @trained.save 
     @trained.update_attributes(attend: "Yes") 
    end 
end 

if @passed = Certificate.where(user_id: params[:certificate][:user_id]).first 
    @passed.update_attributes(pass: "Yes") 
else 
    @passed = Certificate.new(params[:certificate]) 
    if @passed.save 
     @passed.update_attributes(pass: "Yes") 
    end 
end 

redirect_to grandstreamers_resellers_path 

end 

def update 
if @trained = Certificate.where(user_id: params[:certificate][:user_id]) 
@trained.first.update_attributes(attend: "No") 
    redirect_to grandstreamers_resellers_path 

elsif @untrained = Certificate.where(user_id: params[:certificate][:user_id]) 
@untrained.first.update_attributes(attend: "No") 
    redirect_to grandstreamers_resellers_path 
end 

if @passed = Certificate.where(user_id: params[:certificate][:user_id]) 
@passed.first.update_attributes(pass: "No") 
    redirect_to grandstreamers_resellers_path 

elsif @unpassed = Certificate.where(user_id: params[:certificate][:user_id]) 
@unpassed.first.update_attributes(pass: "No") 
    redirect_to grandstreamers_resellers_path 
end 
end 
+0

可能是每個表單中的隱藏字段? – archie

回答

1

現在,它在同時運行參加並通過我只想更新一次一個seperately。

因爲它們沒有限制。您在if條件中提供的限制僅僅是檢查是否存在證書記錄。這對於trainedpassed都是如此。

傳遞一個查詢參數的創建操作,您就可以使用,以確定是否提交的形式是爲trainedpassed。例如:下面

更新form_for@trained@passed

<%= form_for @trained, :url => certificates_path(flag: :attend), :method => :post do |f| %> 

<%= form_for @passed, :url => certificates_path(flag: :pass), :method => :post do |f| %> 

然後在創建params[:flag]

例如行動檢查:

更新create行動如下:

def create 
    @certificate = Certificate.where(user_id: params[:certificate][:user_id]).first 

    if @certificate 
    case params[:flag] 
    when "attend" 
     @certificate.update_attributes(attend: "Yes") 
    when "pass" 
     @certificate.update_attributes(pass: "Yes") 
    end 
    else 
    @certificate = Certificate.new(params[:certificate]) 
    if @certificate.save 
     case params[:flag] 
     when "attend" 
     @certificate.update_attributes(attend: "Yes") 
     when "pass" 
     @certificate.update_attributes(pass: "Yes") 
     end 
    end 
    end 

    redirect_to grandstreamers_resellers_path 
end 
+0

你是什麼意思的行動檢查?在我的控制器檢查標誌的實例變量? – DDDD

+1

查看回答的例子 –

+1

+1你最好,讓我稍微處理一下。 – DDDD