【问题标题】:Rails: How to toggle a boolean field from a view?Rails:如何从视图中切换布尔字段?
【发布时间】:2010-06-13 03:45:07
【问题描述】:

我的数据库中有一个名为“已保存”的布尔字段。我想通过单击文本链接来切换此字段,该链接会根据情况从“保存”更改为“取消保存”,并将我的“客户”表更新为 0 或 1。我想 Javascript 可能是一种解决方法但我在 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:我真的很抱歉让你这么痛苦——我想确认你的答案,但我知道如果我这样做了,我会暂时离开这个问题,然后再回来再次感到沮丧!谢谢大佬。

【问题讨论】:

    标签: javascript ruby-on-rails boolean toggle


    【解决方案1】:

    您必须定义一个控制器方法,它设置您的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

    【讨论】:

    • 嗨@nathanvda,感谢cmets。我已经更新了我上面的问题。
    • 嗨@sscirrus:我已经相应地更新了我的答案。我希望现在更清楚了吗?
    • 嗨@nathanvda:我快到了。只是要过去的最后一个错误-我需要在调用部分时添加 :locals 以便它可以识别“匹配”。但是,切换不起作用。有关更多详细信息,请参阅我的更新。到目前为止,我已经给了你 1+,谢谢。
    • 你有一个周围的 div,有一个 id,并且是你的 `:update => "div-name-here" 中的那个 id。否则它将不知道将渲染结果发送到哪里。
    • @nathanvda:一切似乎都已经到位,但它并没有改变那个该死的切换!我已经简化了所有内容并将其浓缩在上面。
    【解决方案2】:

    只是一个通知:

    您的 save_toggle 方法不是 RESTful。 HTTP PUT 动词应该实现幂等(参见 o.a.http://en.wikipedia.org/wiki/Idempotence#Examples),这意味着无论您执行它的频率如何,它都应该始终执行相同的操作。在您的示例中,执行一次 save_toggle 方法与执行两次的结果不同。

    更好的做法是制作两种方法,例如:

    def set_employer_stars
    end
    
    def unset_employer_stars
    end
    

    或任何你想称呼他们的名字。然后你也可以在link_to_remote方法中使用这两种不同的方法(因为你现在在“Unsave”和“Save”中都使用save_toggle)。

    【讨论】:

    • 非常感谢您对范德霍恩的评论。我会把它带上船。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2021-11-21
    • 2020-11-08
    • 2012-05-17
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多