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(app / controllers / things_controller.rb)のステータスアクションが呼び出されます。
次に何が起こるか、デフォルトでは、他に何もするように指示していないため、railsはapp / views / things / 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
追加
フォームを作成して、何が起こるか見てみましょう
app / views / things / 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
これがフローです。アプリを「/things/ 100/edit」でヒットします。
編集アクションが呼び出され、インスタンス変数@thingがIDが100のレコードに設定されます。次に、edit.html.erbビューがレンダリングされ、名前フィールドの編集画面と送信ボタンが表示されます。
「送信」をクリックすると、「/ things / 100/update」に移動します。
ルートの定義方法'/things /:id / update'により、更新アクションに入ると、params [:id]には100が含まれ、params [:thing]にはフォームによって投稿されたものが含まれます。つまり、パラメータには次のものを含めることができます。
params[:thing][:name]
params[:thing][:city]
....
params[:thing][:zip]
IDはparams[:id]に抽象化され、フォームデータはparams [:thing]にあります。
もっと
railsはあなたのために多くの自動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
フォームをマルチパートにし、属性:uploadをfile_fieldとして宣言したため、paramsが投稿されると、:upload paramには3つの追加メソッド(original_filename、content_type、read)があります。RailsMAGIC!