新手问题 [已解决] 怎样制作暂存按钮?

chairy11 · 2014年09月23日 · 最后由 chairy11 回复于 2014年09月30日 · 3533 次阅读

问题:

如果一个表单需要设置一个“暂存”按钮和一个“提交”按钮。 我的理解是,无论点击哪个按钮,实质都已经 save 到数据库里了。我只是需要用一列“status"去标识,如果暂存,status 为 0, 否则 status 为 1.(由于以后可能还有其它状态,没有用 boolean,而是用 integer) 可是在表单中怎么实现呢?

<%= f.input_field :status, as: :hidden, value: 1, id:'submit_status' %>
<%= f.submit '暂存', class: 'btn btn_lg btn-success',  id:'staging_btn'  %>
<%= f.submit '提交', class: 'btn btn_lg btn-info', id:'submit_btn' %>

我现在想到的是,设置一个 hidden 的 field,点击暂存的时候,用 js 把这个对应:status 的 value 设置为 0,否则就是 1. 但这个好像又不对,点击 submit 按钮它就直接提交了吧?难道会先等 js 执行完? 我的思路对不对?你们都怎么写的? 你们的暂存按钮都怎么实现的?

解决方案:

HTML 中隐藏一个为:status 的 input,然后用 js,在 submit 按钮跳转之前,先根据按钮的值去设置:status 的值。 View 中代码:

<%= link_to '取消', 'javascript:history.back()', class: 'btn btn_lg btn-default pull-left' %>
<%= f.input_field :status, as: :hidden %>
<%= f.submit '暂存', class: 'btn btn_lg btn-success', name:'staging', id:'staging_btn',
             onclick:"" %>
<%= f.submit '提交', class: 'btn btn_lg btn-info',  name:'submit', id:'submit_btn' %>

JS 中代码:

$('#staging_btn').click ->
  $('#personal_weekly_status').val(1)
  return

$('#submit_btn').click ->
  $('#personal_weekly_status').val(2)
  return

submit button 也带 value 的 跟 input 一样的 可以在后端获取的

你的 submit 给一个 name 值:

<%= f.submit '暂存', class: 'btn btn_lg btn-success',  id:'staging_btn', name: "staging_btn"  %>

然后后台:

if params[:staging_btn].present?

不知道这个是不是你想要的结果。

很少见暂存的。

从概念上来说,暂存保存的是 hash 数据,不验证。如果从后端执行的话,填充表格一块要稍微费点手脚。

不过你也可以完全从前端存的,储存在浏览器的 localStorage 就行了。没做过,只知道可行。

@chairy11 用 ajax 提交到后端,后端存储到 memcached,redis 之类,不要存到 db

存 db 会造成大量垃圾数据还影响 db 性能。

#4 楼 @mojidong 额,这个太复杂了,memcached,redis 我暂时都不太会,还不如直接让它存到数据库了。这时候是要验证的了。

#3 楼 @billy 这时候点击暂存就是要存进数据库的了,所以会验证的。只是可能有种情况是,表单比较长,有些人填了一半,然后就点暂存,以后再填别的。前端存的话,如果它不在这个电脑上,下次不就没有了吗?

#1 楼 @themorecolor #2 楼 @JeskTop 你们的意思是,我可以把:status 的 value 放进 submit? 不懂……

<%= f.submit '暂存', class: 'btn btn_lg btn-success',  id:'staging_btn'  %>

现在生成的 html 为:

<input class="btn btn_lg btn-success" id="staging_btn" name="commit"  type="submit" value="暂存">

这里面已经有 name 和 value 啊……自动生成的……

建一张 stage

id
stageable_id
stageable_type
data

需要暂存的数据全部序列化扔到 stage 表,提交后就删了

#7 楼 @saiga 我这个表嵌套着好多子表单,暂存的时候数据其实已经存进 4 个数据表中,按你说的这样,会不会更复杂?

#6 楼 @chairy11 请仔细看二楼的代码, 实际上就是给 submit 也加上一个 name,这样后台就可以接到是点的哪个按钮了

#9 楼 @bydmm 可是现在 simple_form 已经自动生成一个 name="commit" ,改了这个我不知道会影响什么啊!

#10 楼 @chairy11 没任何影响。

#11 楼 @bydmm 哦,我试试……

前台针对相同的 submit_button 设置不同的 value,后台 controller 可以通过 params[:commit] 的值的不同来做不同的动作 <% form_for(something) do |f| %> .. <%= f.submit 'A' %> <%= f.submit 'B' %> .. <% end %>

def if params[:commit] == 'A' # A was pressed elsif params[:commit] == 'B' # B was pressed end end

#14 楼 @317583395 我试过在 controller 里写,但感觉好像处理不好。还是用 Js 中处理吧。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号