0

私は、C# のバックグラウンドから来て、Rails をよりよく学ぶための非常に単純なプロジェクトに取り組んでいます。私のコードで間違ったフォーム アクションをレンダリングしているようです。

現在、のルートを使用している 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には、新しいリークを作成するための2つの方法があります:

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">

なぜこれが当てはまるのか、手がかりはありますか?

4

1 に答える 1

1

Rails の安らかな性質といくつかの本格的なメタプログラミングにより、オブジェクトform_forのインスタンスを使用する場合、ヘルパーActiveRecordは次のように単純であると想定します。

<% form_for @leak do |f| %>

送信されると、コントローラーPOSTcreateアクションが実行されます。
Rails アプリが従うデフォルトのパターンに従わない、より具体的なフォームが必要な場合は、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

于 2012-06-26T01:20:12.017 に答える