我是Ruby on Rails的新手,我正在尝试更新设备属性(lastChangedBy),只要单击提交按钮,该属性就会将其值设置为用户的IP地址。我想做类似的事情:
<%= form_for(@device) do |f| %>
.
.
.
<%= if click? ( f.submit "Commit Entries", class: "btn btn-primary" ) == true %>
<%= @device.lastChangedBy = request.remote_ip %>
<% end %>
但我不认为这是可能的。我正在研究使用“button_to”,但在网上搜索后,我对如何使用它感到非常困惑。我尝试过这样的事情:
<%= button_to "Commit Entries", action: "setIp" %>
然后在DevicesController&amp;在helper.rb中(因为我不确定它将调用该方法的位置)我做了一个简单的方法:
def setIp
Device.find(params[:id])
@device.lastChangedBy = request.remote_ip
end
但我完全迷失了。有人可以帮帮我吗如果你具体的话会很棒!
答案 0 :(得分:1)
如果您已经提交了表单,并且想要设置该参数,请在控制器中执行此操作:
class DevicesController < ApplicationController
def update
@device = Device.find(params[:id])
@device.last_changed_by = request.remote_ip # Tada!
if @device.update_attributes(params[:device])
redirect_to @device
else
render 'edit'
end
end
end
根据您的申请调整,但这是基本想法。
答案 1 :(得分:0)
由于您提到您不确定如何利用button_to调用函数,并且您已经在控制器中有一个方法,您可以通过向视图的button_to添加一些字段来实现如下操作。使用这种方法,您还可以删除表单。
=button_to 'SetIp', {:controller => "your_controller",
:action => "setIp", :id => your_model.id}, {:method => :post }
在您的routes.rb
中resources :your_controller do
post :setIp, :on => :collection
end
在your_controller.rb
中def setIp
device = Device.find(params[:id])
device.lastChangedBy = request.remote_ip
device.save!
#Can redirect to anywhere or render any page
redirect_to action: :index
end