form_for @project_profile和form_for:project_profile之间有什么区别?

时间:2011-06-21 21:56:26

标签: ruby-on-rails forms routing

我刚开始学习rails。我的rails版本是3.0.7。我想知道<%form_for:project_profile%> <%form_for @project_profile%> 之间有什么区别。我有这个问题,因为我遇到了以下情况:

  • 如果我使用<%form_for:project_profile%> ,它不会给我一个错误,但表单实际上无效。

  • 如果我使用<%form_for @project_profile%> ,我将收到错误:#<#:0x00000103546d80>

    <的未定义方法`project_profile_path' / LI>
  • 如果我使用&lt;%= form_for @project_profile,: url =&gt; “/ projects /#{params [:project_id]} / profile / update”do | f | %&gt;,它会起作用,但代码很难看。


您可以参考以下代码来更好地了解我的问题的背景。

我有一个项目模型和一个project_profile模型。一个项目有一个project_profile。

以下两行来自我的 routes.rb

match '/projects/:project_id/profile/edit' => "project_profiles#edit"
match '/projects/:project_id/profile/update' => "project_profiles#update"

这来自我的project_profiles_controller.rb

class ProjectProfilesController < ApplicationController
  def edit
    @project_profile = Project.find(params[:project_id]).project_profile
  end
  def update
    @project_profile = Project.find(params[:project_id]).project_profile

    respond_to do |format|
      if @project_profile.update_attributes(params[:project_profile])
        format.html {}
      else
        format.html { render :action => "edit" }
      end
    end
  end
end

以下代码来自 _form.html.erb

<%= form_for @project_profile, :url => "/projects/#{params[:project_id]}/profile/update" do |f| %>
    <div class="field">
      <%= f.label :title %>
      <br/>
      <%= f.text_field :title %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
<% end %>

2 个答案:

答案 0 :(得分:2)

您应该了解Rails中的资源和嵌套资源routing

定义控制器的方式也不常规。有一篇关于“入门指南”的文章,covers that也是如此。

答案 1 :(得分:0)

基本上说,form_for @project_profile是一种高级(面向资源),现在是首选的样式。如果你想深入研究一下,API本身就能很好地解释它们之间的区别。

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

欢呼声