【问题标题】:Form_for generates resource path ending with '.1'Form_for 生成以 '.1' 结尾的资源路径
【发布时间】:2011-09-29 13:08:45
【问题描述】:

我有一个名为 :school 的资源,当我调用 form_for(@school) 时,它会生成表单操作:

/school.1

我对这一切都很陌生,所以任何关于它为什么这样做的线索都将不胜感激。睡眠不足,3 小时后赶上最后期限,arrrggg!

谢谢:)

routes.rb:

resource:school

school.rb:

<%= form_for(@school, :url => school_path) do |f| %>
  <% if @school.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@school.errors.count, "error") %> prohibited this school from being saved:</h2>

      <ul>
      <% @school.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :address1 %><br />
    <%= f.text_field :address1 %>
  </div>
  <div class="field">
    <%= f.label :address2 %><br />
    <%= f.text_field :address2 %>
  </div>
  <div class="field">
    <%= f.label :address3 %><br />
    <%= f.text_field :address3 %>
  </div>
  <div class="field">
    <%= f.label :town %><br />
    <%= f.text_field :town %>
  </div>
  <div class="field">
    <%= f.label :county %><br />
    <%= f.text_field :county %>
  </div>
  <div class="field">
    <%= f.label :postcode %><br />
    <%= f.text_field :postcode %>
  </div>
  <div class="field">
    <%= f.label :local_authority_id %><br />
    <%= f.collection_select :local_authority_id, LocalAuthority.all, :id, :name %>
  </div>
  <% if current_user.person.primary_user? %>
    <div class="field">
      <%= f.label 'Are you happy for us to send you regular updates about VRH?' %><br />
      <%= f.check_box :allow_contact %>
    </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

  • @school 中有什么,更重要的是,routes.rb 中有什么...
  • @school 是一个 ActiveRecord 对象。我的路线定义为:资源:学校

标签: ruby-on-rails resources routing ruby-on-rails-3.1 form-for


【解决方案1】:

通过使用单一资源方法,您告诉 rails 这些对象中只有一个存在,在您的路线文件中,我认为您需要将资源 :school 更改为...

resources :schools

如果您确实只想要一所学校,那么我认为您需要将 url 选项添加到 form_for...

<% form_for(@school, :url => school_path) %>

针对后续问题提出的解决方案...

我认为你需要的是这样的......

# routes.rb
resources :users do
  resources :schools
end
resources :schools

# app/controllers/schools_controller.rb
class SchoolsController < ApplicationController
  def new
    @user = User.find(params[:user_id])
    @school = @user.build_school
  end

  def create
    @user = User.find(params[:user_id])
    @school = @user.build_school(params[:school])
    if @school.save
      # success...
    else
      # fail...
    end
  end

  def edit
    @school = School.find(params[:id])
  end

  def update
    @school = School.find(params[:id])
    if @school.update_attributes(params[:school])
      # success
    else
      # fail
    end
  end
end

# app/views/schools/new.html.erb
<%= form_for([@user, @school]) do |f| %>
  <!-- fields go here -->
<% end %>

# app/views/schools/edit.html.erb
<%= form_for([@user, @school]) do |f| %>
  <!-- fields go here -->
<% end %>

【讨论】:

  • 谢谢 roboles。数据库中将有多个学校记录,但我希望从路由的角度将其视为单一资源,因为用户只会处理其用户记录中指定的单个学校。知道“.1”的意义是什么吗?
  • 嗨杰罗姆,很高兴我能帮上忙。学校和用户的路由将取决于您是否打算将同一所学校与许多不同的用户相关联。让我知道你希望做什么,我可以提出一些建议。末尾的“.1”是 form_for 请求中使用的学校记录的 id。在幕后 form_for 方法将查找其给定资源所需的路径。对于您的学校记录,它会找到一个单一的资源路径,因此会附加带有对象 id 的 url,作为能够将额外参数附加到路径的副产品。
  • 是的,我们的想法是一所学校会有很多用户,而目前,用户只能看到与他们关联的一所学校。我认为在这种情况下使用'resource:school'似乎是有意义的,我想问题在于说服form_for它正在处理单例资源,因此它不需要附加id。非常感谢您在这方面的时间和建议。
  • 酷,我还有几个问题... 1) 学校表是否预先填充了一组学校记录? 2) 您能否添加一份表单模板的副本,以便我可以看到您尝试发送给控制器的内容?
  • 是的,它目前是从 CSV 文件中预填充的。在某些时候,管理员用户需要能够查看所有学校,但这在某种程度上是可行的。上面添加的表单模板。
【解决方案2】:

我的 routes.rb 文件中的单个配置文件资源也遇到了类似的问题:

resource :profile

我花了几个小时才找到解决方案,所以我决定分享它以节省其他人的麻烦。
我必须通过指定特定格式来删除路线的“(.:format)”部分(在运行“rake routes”时显示):

constraints :format => "html" do  
  resource :profile  
end  

我还必须在 form_for 标签中添加 :url 选项:

<% form_for(@profile, :url => profile_path) %>

而且成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多