我的数据库中有一个名为“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:我真的很抱歉这么痛苦 - 我想确认你的答案,但我知道如果我这样做,我会暂时离开这一段然后又回到它并再次感到沮丧!谢谢你。
答案 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
。