新手问题 为什么 link_to 在刷新时会自动执行?

zix · October 08, 2016 · Last by msg7086 replied at October 10, 2016 · 2253 hits
<%= link_to "开始游戏", {controller: "games", action: "start",id: @game.id},remote:true, :method => :get,"data-no-turbolink"=>true,class: "btn btn-primary btn-block ", id: "begin_button"  %>

controller

def start
  @game = Game.find(params[:id])
  @game.start
  respond_to do |format|
    format.js { }
  end
end

我发现如果我点了这个链接,之后每次刷新页面时都会自动执行 game start 这个动作 这是为何? 补充 game model

def start
    self.pads.each_with_index do |pad,index|
      ActionCable.server.broadcast "pad_channel_#{pad.room.true_number}",
                                    {action: "game_start",role: pad.role, message: render_message(pad) }
    end
    self.update(begin_time:Time.new)
end

刷新页面不就是重新请求吗?!当然会执行 action 啊。

#1 楼 @tesla_lee 确实。。有没有办法取消这个特性呢。。

如果你 start 就只是做 start 的话,应该把 method 做成 post,start 完了以后马上 redirect 回本体。 否则就要在后台维护用户的状态。

问题问错了,你用了错误的方法当然达不到正确的结果。 先想明白你想要达到什么效果,然后问怎么实现这个效果。最后在帖子里描述你做了什么,以及你认为你这样做出了什么问题。

#2 楼 @zix 如 4 楼所说,你没明白你要做的是什么,你先你问的问题有点像是,1 + 1 = 2 了,但是你希望这个结果是 3,能不能想办法让 1 + 1 = 3,哪怕可以。但是你改变了基础的东西。😀 我的建议是,你回头想想你要实现什么?然后再想想,用什么来实现,一定要页面跳转吗?不同用一个 Post 请求来实现?

我不想要跳转,只想用这个按钮来触发 start,同时要告诉 controler 是这个@game触发的。想用 ajax 来做 @tesla_lee @msg7086 @nowherekai

再想想你想要什么。 你看的 Rails 教程或者 guide 里面,肯定有个 new action,还有个 create action,为什么不能只有一个 new 或者 create 就行呢?

#7 楼 @nowherekai 我知道啊 new 是处理 get,create 是处理 post 我试下 post 吧

不是 post 的问题。你的 link_to 是属于哪个 action?我以为是你的 start 这个 action 有两个作用,既显示 link_to 又想 game.start。如果不是的话就是我搞错了。但是也不是 post 的问题,get 的时候,你点了这个链接浏览器地址栏的地址是/1/start 这样吗?把 log 也贴出来吧

我在我这测试的是 Safari 有这个问题,chrome,firefox 没有这个问题。

#10 楼 @lehug 我改成 post 没事了……

#11 楼 @zix 改成 post 刷新也会触发风怒的。

zix closed this topic. 10 Oct 17:12
You need to Sign in before reply, if you don't have an account, please Sign up first.