簡體   English   中英

Rails:如何從視圖切換布爾字段?

[英]Rails: How to toggle a boolean field from a view?

我的數據庫中有一個布爾字段,稱為“保存”。 我想通過單擊一個文本鏈接來切換此字段,該文本鏈接根據情況從“保存”更改為“取消”,並用0或1更新我的“客戶”表。我想Java語言可能是解決此問題的一種方法但是我對Javascript的經驗還不夠(到目前為止!),不知道如何進行編碼。

我回滾了問題以使其更短。 這是我的確切代碼。

#employers controller
def save_toggle
  @matching = Matching.find(params[:id])
  if @matching.employer_stars == false
    @matching.employer_rejects = false # If saving a match, remove any existing rejection.
  end
  @matching.employer_stars = !@matching.employer_stars
  @matching.save
  render :partial => "save_unsave_buttons", :layout => false
end

#view home.html.erb
<%= render :partial => "save_unsave_buttons", :locals => {:matching => matching} %>

#partial _save_unsave_buttons.html.erb
<div id="save_buttons" class="buttonText"> #latter is just for CSS layout
  <% if @matching.employer_stars %>
    <%= link_to_remote "Unsave",
      :url => {:action => "save_toggle", :id => matching.id},
      :update => {:success => "save_buttons", :failure => "Error"} %>
  <% else %>
    <%= link_to_remote "Save",
      :url => {:action => "save_toggle", :id => matching.id},
      :update => {:success => "save_buttons", :failure => "Error"} %>
  <% end %>
</div>

數據庫正在工作,但切換文本未切換。 致@nathanvda:非常抱歉讓您感到如此痛苦-我想確認您的回答,但我知道如果我這樣做,我將把它擱置一會兒然后再回到它並再次感到沮喪! 謝啦。

您必須定義一個控制器方法,該方法可以設置您saved屬性。 在您看來,您可以使用link_to_remote鏈接到此方法。

那應該讓您開始。

-更新:更新問題后:

您應該創建一個部分來渲染您的保存/取消保存按鈕,將其命名為“ _save_unsave_buttons.html.erb”:

<div id="save_buttons">
  <% if matching.employer_stars %>
    <%= link_to_remote "Unsave",
       :url => {:action => "save_toggle", :id => matching.id},
       :update => {:success => "save_buttons", :failure => "Error"} %>
  <% else %>
    <%= link_to_remote "Save",
       :url => {:action => "save_toggle", :id => matching.id},
       :update => {:success => "save_buttons", :failure => "Error"} %>
  <% end %>
</div>

此部分將為您提供正確的保存按鈕,並且在更新時,包含的div將通過控制器操作的結果進行更新/替換。

在您的主視圖中,編寫

<%= render :partial => "save_unsave_buttons", :locals => {:matching => match } %>

您希望按鈕可見的位置。

在您的控制器內部:

def save_toggle
  @matching = Matching.find(params[:id])
  @matching.employer_stars = !@matching.employer_stars
  @matching.save
  render :partial => "save_unsave_buttons", :locals => {:matching => @matching}, :layout => false
end

祝好運!

-再次更新:所以我假設您呈現了一組@matchings,我會稍微更改集合和項目之間的命名,以防止出現更多的混亂和意外的迷惑。

但這實際上很簡單:

@matchings.each do |match|
  .. build your view here ..
  <%= render :partial => "save_unsave_buttons", :locals => {:matching => match}
end

然后您就可以在局部使用正確的matching

只是一個通知:

您的save_toggle方法不是RESTful的。 HTTP PUT動詞應實現冪等(請參閱http://en.wikipedia.org/wiki/Idempotence#Examples ),這意味着無論執行頻率如何,它都應始終執行相同的操作。 在您的示例中,執行一次save_toggle方法不會產生與兩次執行相同的結果。

更好的做法是制作兩種方法,例如:

def set_employer_stars
end

def unset_employer_stars
end

或任何您想給他們打電話的東西。 然后,您還可以在link_to_remote方法中使用這兩種不同的方法(因為現在在“取消保存”和“保存”中都使用save_toggle )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM