1

この Railscastに示すように、チェックボックスフォームで複数のレコードを編集しようとしています。それ以来、Rails は変更されており、ルーティングとフォームに問題があります。

PeopleController があり、すべての電話番号を一度に編集するフォームを作成しようとしています。はい、これが便利な機能ではないことはわかっています。通常、全員の電話番号を同じものに変更する理由はありませんが、コードに慣れるためにこれを使用しているだけで、機能していません!

これが私が持っているものです:

people_controller:

class PeopleController < ApplicationController
  helper_method :sort_column, :sort_direction

  def index
    @people = Person.order(sort_column + " " + sort_direction)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @people }
    end
  end

  # GET /people/1
  # GET /people/1.json
  def show
    @person = Person.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @person }
    end
  end

  # GET /people/new
  # GET /people/new.json
  def new
    @person = Person.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @person }
    end
  end

  # GET /people/1/edit
  def edit
    @person = Person.find(params[:id])
  end

  # POST /people
  # POST /people.json
  def create
  ...
  end

  # PUT /people/1
  # PUT /people/1.json
  def update
  ...
  end

  def update_multiple
    @people = Person.find(params[:people_ids])
    @people.each do |person|
      person.update_attributes!(params[:person].reject { |k,v| v.blank? })
    end
    flash[:notice] = "Updated people"
    redirect_to people_path
  end

  # DELETE /people/1
  # DELETE /people/1.json
  def destroy
  ...
  end

  private

  def sort_column
    Person.column_names.include?(params[:sort]) ? params[:sort] : "name"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end

end

index.html.erb:

<h1>Listing people</h1>
<% form_tag edit_multiple_people_path do %>
<table>
  <tr>
    <th></th>
    <th><%= sortable "name" %></th>
    <th><%= sortable "phone" %></th>
    <th><%= sortable "created_at" %></th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @people.each do |person| %>
  <tr>
    <td><%= check_box_tag "people_ids[]", person.id %></td>
    <td><%= person.name %></td>
    <td><%= person.phone %></td>
    <td><%= person.created_at %></td>
    <td><%= link_to 'Show', person %></td>
    <td><%= link_to 'Edit', edit_person_path(person) %></td>
    <td><%= link_to 'Destroy', person, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</table>
<% # submit_tag "Edit Checked" %>
<% end %>
<br />

<%= link_to 'New Person', new_person_path %>

edit_multiple.html.erb:

<%= form_for :person, :url => update_multiple_path, :html => { :method => :put } do |f| %>
  <ul>
    <% @people.each %>
      <li>
        <%= hidden_field_tag "people_ids[]", person.id %>
        <%=h person.name %>
      </li>
    <% end %>
  </ul>

  <p>
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </p>

  <p><%= f.submit "Submit" %></p>
<% end %>

Routes.rb:

  resources :people do
    collection do
      put 'update_multiple'
    end
  end

そしてレーキルート:

update_multiple_people PUT    /people/update_multiple(.:format) people#update_multiple
                people GET    /people(.:format)                 people#index
                       POST   /people(.:format)                 people#create
            new_person GET    /people/new(.:format)             people#new
           edit_person GET    /people/:id/edit(.:format)        people#edit
                person GET    /people/:id(.:format)             people#show
                       PUT    /people/:id(.:format)             people#update
                       DELETE /people/:id(.:format)             people#destroy

編集:

私のルートはめちゃくちゃでした。上記のように、現在は正常に動作しています。

4

3 に答える 3

1

単数形と複数形のリソースを混同しています。ルートは現在、単一のリソースとして構成されています。edit_multiple_pathつまり、単一のリソースがPerson引数として渡されることを期待しています。ただし、定義上、一度に複数の人を更新しようとしています。この場合、単一のルートを使用しても意味がありません。

代わりに、収集ルートを試してください。

# config/routes.rb
resources :people
    collection do
        post 'update_multiple/:people_ids', :action => 'update_multiple'
    end
end

これにより、次のルートが利用可能になります。

       update_multiple_invites POST   /invites/update_multiple/:people_ids(.:format) invites#update_multiple

編集:

インデックス ビューでは、フォームを表示するためにフォームを出力する必要があります。

# app/views/people/index.html.erb
<%= form_tag edit_multiple_people_path do %>

# app/views/people/_edit_multiple.html.erb
<%= form_for :person, :url => update_multiple_people_path, :html => { :method => :put } do |f| %>

<% %>に囲まれたすべてを解釈しますが、それを出力しないことに注意してください。<%= %>フォームの内容を実際に出力するには、を使用する必要があります。

.erbまた、パーシャルがRuby コードを解釈するには拡張が必要であることを忘れないでください。それに応じて名前を付けたのかもしれませんが、投稿edit_multiple.html .erb.

于 2013-07-06T04:07:17.923 に答える
0

このルートを取得しようとしています:

{:controller="people", :action="edit_multiple"} に一致するルートはありません

しかし、route.rb には :id 属性を含めています witch が必要です

人/:id/edit_multiple

したがって、フォームに個人IDを含める必要があります

このルートを取得するには、次のコードを試してください {:controller="people", :action="edit_multiple"}

resources :people do               
 collection do         
  get :edit_multiple       
  put :update_multiple       
 end        
end      
于 2013-07-06T03:54:41.270 に答える
0

submitコードインスペクターを見て、リクエストにルーティングされているかどうかを確認してくださいGET

PUT 要求ではなく GET 要求になる 404 を取得している場合は、:method => :putオプションが JavaScript に依存していたことが原因です。jquery-railsがアプリに適切に統合されていることを確認する必要があります。

于 2013-07-06T03:25:59.530 に答える