Rails:如何从视图中切换布尔字段?

时间:2010-06-13 03:45:08

标签: javascript ruby-on-rails boolean toggle

我的数据库中有一个名为“saved”的布尔字段。我希望通过单击根据情况从“保存”更改为“未保存”的文本链接来切换此字段,并使用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:我真的很抱歉这么痛苦 - 我想确认你的答案,但我知道如果我这样做,我会暂时离开这一段然后又回到它并再次感到沮丧!谢谢你。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只是一个通知:

您的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