2012-06-26 1 views
0

Я работаю над очень простым проектом, чтобы лучше узнать Rails, исходя из фона C#. Кажется, это делает неправильное действие формы с моим кодом.form_for с пользовательским действием без рендеринга

В настоящее время есть 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 %> 

Я думаю, что с этой точки зрения, было бы создать форму с действием = Создать, но следующий код генерируется:

<form accept-charset="UTF-8" action="/leaks" class="new_leak" enctype="multipart/form-data" id="new_leak" method="post"> 

Любой ключ, почему это будет так?

ответ

1

Из-за девственной природой Rails' и некоторые серьезные метапрограммированием, в form_for помощник при использовании с экземпляром ActiveRecord объекта, предполагает, что простое:

<% form_for @leak do |f| %> 

Когда представил бы сделать POST к create действия на ваш контроллер.
Если вам нужна более конкретная форма, которая не соответствует стандартным шаблонам, приложение 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

+0

Спасибо, я не понимал, что рельсы делали магию, чтобы сделать «виртуальный» POST для/утечки/создания. Я все еще не уверен, как это работает, но это так. Моя проблема была на самом деле глубже, с моей собственной проверкой. Но это указывало мне в правильном направлении! – mandreko