form_for,自定义操作无法呈现

时间:2012-06-26 01:10:24

标签: ruby-on-rails-3 rails-routing

我正在开发一个非常简单的项目来更好地学习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">

为什么会出现这种情况?

1 个答案:

答案 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