我正在开发一个非常简单的项目来更好地学习Rails,来自C#背景。它似乎是用我的代码呈现不正确的表单操作。
目前有2个型号正在使用
的路线 resources :leaks
resources :passwords
这是给我基本的路线:
Matts-MacBook-Pro:pwcrack-webgui mandreko$ rvm 1.9.3 do rake routes
leaks GET /leaks(.:format) leaks#index
POST /leaks(.:format) leaks#create
new_leak GET /leaks/new(.:format) leaks#new
edit_leak GET /leaks/:id/edit(.:format) leaks#edit
leak GET /leaks/:id(.:format) leaks#show
PUT /leaks/:id(.:format) leaks#update
DELETE /leaks/:id(.:format) leaks#destroy
passwords GET /passwords(.:format) passwords#index
POST /passwords(.:format) passwords#create
new_password GET /passwords/new(.:format) passwords#new
edit_password GET /passwords/:id/edit(.:format) passwords#edit
password GET /passwords/:id(.:format) passwords#show
PUT /passwords/:id(.:format) passwords#update
DELETE /passwords/:id(.:format) passwords#destroy
在我的leakscontroller.rb中,我有两种方法,尝试创建一个新的泄漏:
def new
@leak = Leak.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @leak }
end
end
def create
@leak = Leak.new(params[:leak])
if @leak.save
redirect_to @leak, :notice => "Successfully created leak."
else
render :action => 'new'
end
end
最后,在我的new.html.erb中,我有:
<%= form_for @leak, :url => { :action => "create" } do |f| %>
<div class="field>
<%= f.label :source %>
<%= f.text_field :source %>
</div>
<div class="field">
<%= f.label :file %>
<%= f.file_field :file %>
</div>
<div>
<%= f.submit %>
</div>
<% end %>
我认为使用此视图,它会创建一个带有action = Create的表单,但会生成以下代码:
<form accept-charset="UTF-8" action="/leaks" class="new_leak" enctype="multipart/form-data" id="new_leak" method="post">
为什么会出现这种情况?
答案 0 :(得分:1)
由于Rails的安静性和一些严重的元编程,form_for
帮助器在使用ActiveRecord
对象的实例时,假设一个简单的:
<% form_for @leak do |f| %>
提交时,会对您的控制器上的POST
操作进行create
如果您需要更具体的表单,而不是按照Rails App所遵循的默认模式,您可以使用form_tag
帮助程序。
例如,如果您的控制器中有secret_action
,则可以在routes.rb
中创建路线。
resources :leaks do
collection do
post :secret_action
end
end
这样的形式:
<% form_tag secret_action_leaks_path do %>
你得到了你期望的行为。一旦你理解了Rails中路由,路径,表单的基本知识,你就可以毫不费力地做这些事情 尝试阅读其中一些内容:http://guides.rubyonrails.org/routing.html