1 )是的,控制器的“行动”不必处理模型,即
ThingController < ApplicationController
def status
@status = system("#{Rails.root}/lib/mystatusscript");
end
end
当URL访问服务器,查询路由表,并确定控制器和操作时,会调用操作。所以,如果你把这个在你的routes.rb:
match "/whatever" => "things#status"
,并键入
http://localhost:3000/whatever
在ThingsController(应用程序/控制器/ things_controller.rb)状态的动作将被调用。
接下来会发生什么,默认情况下,因为你还没有告诉它做任何事情,轨道将寻找应用程序/视图/事/ status.html.erb,并使其,即:
The stats is <%= @status %>
但是你可以防止这种情况,并进行轨道做别的事情,可能的例子:
ThingController < ApplicationController
def status
@status = system("#{Rails.root}/lib/mystatusscript");
render :js=>"$('#status_retreived').show();"
end
end
ThingController < ApplicationController
def status
system("#{Rails.root}/lib/do_something_server_side");
render :nothing=>true
end
end
ThingController < ApplicationController
def status
@status = system("#{Rails.root}/lib/mystatusscript");
render action=>:edit
end
end
附加
让我们做一个表格,看看会发生什么
说你的应用程序/视图/事/ edit.html.erb有这样的:
<%= form_for @thing do |f| %>
<%= f.input :name %>
<%= f.submit %>
<% end %>
说你在routes.rb中这些路线:
get '/things/:id/edit' => 'things#edit'
put '/things/:id/update' => 'things#update'
而且你的控制器具有:
def update
@thing = Thing.find(params[:id])
@thing.attributes = params[:thing]
@thing.save
end
def edit
@thing = Thing.find(params[:id])
end
因此,这里的流量,你打你的应用程序以 '/事/ 100 /编辑'
调用编辑操作,实例变量@thing设置为ID为100的记录。然后呈现edit.html.erb视图,向您显示名称字段和提交按钮的编辑屏幕。
当你点击“提交”,您将投入到“/事/ 100 /更新”
的,因为其路由定义“/事/:ID /更新”的方式,当你进去的更新动作,则params [:编号]将包含100,而params [:东西]将包含什么被张贴的形式,即您的PARAMS可以包含:
params[:thing][:name]
params[:thing][:city]
....
params[:thing][:zip]
的ID被抽象到PARAMS [:ID ],表单数据为参数[:东西]
更多
个
轨道做了很多自动生成的URL为你的,这是它非常聪明,例如,在edit.html.erb,你有这样的:
<%= form_for @thing do |f| %>
<%= f.input :name %>
<%= f.submit %>
<% end %>
如果你看一下HTML生成的你”我会看到类似的东西:
<form id="edit_thing_100" method="put" action="/things/100/update">
轨道如何知道做更新而不是创建?因为它检查了@thing并注意到它已经被保存到数据库中,所以它不是新记录,所以它必须是更新。
那么在你看来,你通常创建不同的URI是那些获得通过链接发送到服务器,提交按钮等。当他们在routes.rb中抬起头来,在适当的控制器适当的行动被调用。
文件上传
也许比你想象的更容易,首先你需要稍微添加文件上传字段和更改形式:
<%= form_for @thing do ,:html=>{:multipart=>true} |f| %>
<%= f.input :name %>
<%= f.file_field :upload %>
<%= f.submit %>
<% end %>
现在,当更新动作里面你可以这样做:
def update
filename = params[:thing][:upload].original_filename
filetype = params[:thing][:upload].content_type
filedata = params[:thing][:upload].read
File.open("#{Rails.root}/filestorage/#{filename}","wb") { |f| f.write(filedata) }
@thing = Thing.find(params[:id])
@thing.attributes = params[:thing]
@thing.uploadstoredin = "#{Rails.root}/filestorage/#{filename}"
@thing.save
end
因为你所做的形式多,你声明的特性:上传的是,file_field,当PARAMS张贴的:上传PARAM有三个额外的我thods(original_filename,content_type和read),Rails MAGIC!
那么在涉及表单的情况下会发生什么?如果我有一个上传表单在我的应用程序/视图/东西/ status.html.erb视图 <(%)=的form_tag({:动作=>:上传}:多=>真)做%> <%= file_field_tag '文件' %> <%= submit_tag '上传' %> <% end %> 我点击提交? params [:file]对象在哪里去,我将在哪里解析它的数据?对不起,这个丑陋的输出。 – Utopia025 2013-02-20 22:59:43
添加了一些更多解释 – RadBrad 2013-02-20 23:27:05
您指定的路线如何知道彼此进行交互?如何知道编辑表单将条目提交给更新操作? (非常感谢所有事情,到目前为止,您一直非常乐于助人!!!) – Utopia025 2013-02-21 19:40:42