1

중첩 된 리소스가있는 레일에서 작업하면 Create/Create 메소드로 리디렉션 된 편집/업데이트 메소드를 사용할 때 문제가 발생합니다. 다음은 내 데모입니다 :중첩 된 리소스가있는 레일스를 편집/업데이트 메소드를 생성 메소드로 리디렉션합니다.

모델

class Model < ActiveRecord::Base 
    has_many :lineitems, dependent: :destroy 
end 

class Lineitem < ActiveRecord::Base 
    belongs_to :model 
end 

경로

#resources :lineitems 
#resources :models 

resources :models do 
    resources :lineitems 
end 

레이크 노선

  lineitems GET /lineitems(.:format)lineitems#index 
         POST /lineitems(.:format)         lineitems#create 
     new_lineitem GET /lineitems/new(.:format)        lineitems#new 
     edit_lineitem GET /lineitems/:id/edit(.:format)       lineitems#edit 
      lineitem GET /lineitems/:id(.:format)        lineitems#show 
         PATCH /lineitems/:id(.:format)        lineitems#update 
         PUT /lineitems/:id(.:format)        lineitems#update 
         DELETE /lineitems/:id(.:format)        lineitems#destroy 
       models GET /models(.:format)          models#index 
         POST /models(.:format)          models#create 
      new_model GET /models/new(.:format)         models#new 
      edit_model GET /models/:id/edit(.:format)        models#edit 
       model GET /models/:id(.:format)         models#show 
         PATCH /models/:id(.:format)         models#update 
         PUT /models/:id(.:format)         models#update 
         DELETE /models/:id(.:format)         models#destroy 
     model_lineitems GET /models/:model_id/lineitems(.:format)     lineitems#index 
         POST /models/:model_id/lineitems(.:format)     lineitems#create 
    new_model_lineitem GET /models/:model_id/lineitems/new(.:format)    lineitems#new 
    edit_model_lineitem GET /models/:model_id/lineitems/:id/edit(.:format)   lineitems#edit 
     model_lineitem GET /models/:model_id/lineitems/:id(.:format)    lineitems#show 
         PATCH /models/:model_id/lineitems/:id(.:format)    lineitems#update 
         PUT /models/:model_id/lineitems/:id(.:format)    lineitems#update 
         DELETE /models/:model_id/lineitems/:id(.:format)    lineitems#destroy 
         GET /models(.:format)          models#index 
         POST /models(.:format)          models#create 
         GET /models/new(.:format)         models#new 
         GET /models/:id/edit(.:format)        models#edit 
         GET /models/:id(.:format)         models#show 
         PATCH /models/:id(.:format)         models#update 
         PUT /models/:id(.:format)         models#update 
         DELETE /models/:id(.:format)         models#destroy 

모델 - show.html.erb

<% @model.lineitems.each do |li| %> 
    <tr> 
    <td><%= li.tLineitemNumber %></td> 
    <td><%= link_to 'Show', model_lineitem_path(@model, li) %></td> 
    <td><%= link_to 'Edit', edit_model_lineitem_path(@model, li) %></td> 
    </tr> 
<% end %> 
,451,515,

LINEITEM - edit.html.erb

<%= form_for ([@model, @model.lineitems.build]) do |f| %> 
    <p> 
    <%= f.label :tLineitemNumber, "Line Item Number/Level" %><br> 
    <%= f.text_field :tLineitemNumber %> 
    </p> 
    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

lineitems_controller.rb

class LineitemsController < ApplicationController 
    def create 
    @model = Model.find(params[:model_id]) 
    @lineitem = @model.lineitems.create(lineitem_params) 
    if @lineitem.save 
     redirect_to model_path(@model) 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @model = Model.find(params[:model_id]) 
    @lineitem = @model.lineitems.find(params[:id]) 
    end 

    def update 
    @model = Model.find(params[:model_id]) 
    @lineitem = @model.lineitems.find(params[:id]) 
    if @lineitem.update(lineitem_params) 
     redirect_to model_path(@model) 
    else 
     render 'edit' 
    end 
    end 

    private 
    def lineitem_params 
     params.require(:lineitem).permit(:model_id, :id, :tLineitemNumber) 
    end 
end 

"편집"링크를 클릭이 같은 URL로 이동 :

http://localhost/models/2/lineitems/16/edit 

그리고를 확인 서버 로그에 다음이 있음 :

Started GET "/models/2/lineitems/16/edit" for 192.168.32.2 at 2015-02-07 18:24:18 +0800 
Processing by LineitemsController#edit as HTML 
    Parameters: {"model_id"=>"2", "id"=>"16"} 
    Model Load (0.1ms) SELECT `models`.* FROM `models` WHERE `models`.`id` = 2 LIMIT 1 
    Lineitem Load (0.1ms) SELECT `lineitems`.* FROM `lineitems` WHERE `lineitems`.`model_id` = 2 AND `lineitems`.`id` = 16 LIMIT 1 
    Rendered lineitems/_form.html.erb (2.9ms) 
    Rendered lineitems/edit.html.erb within layouts/application (4.1ms) 
Completed 200 OK in 238ms (Views: 195.7ms | ActiveRecord: 2.8ms) 


Started POST "/models/2/lineitems" for 192.168.32.2 at 2015-02-07 18:26:43 +0800 
Processing by LineitemsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"oCGgftEl9emkAhKEkA/NqjXO6qH7nVE7FC9ohZpjmjI=", "lineitem"=>{"tLineitemNumber"=>"bbbb"}, "commit"=>"Create Lineitem", "model_id"=>"2"} 
    Model Load (0.1ms) SELECT `models`.* FROM `models` WHERE `models`.`id` = 2 LIMIT 1 
    (0.3ms) BEGIN 
    SQL (0.3ms) INSERT INTO `lineitems` (`created_at`, `model_id`, `tLineitemNumber`, `updated_at`) VALUES ('2015-02-07 10:26:43', 2, 'bbbb', '2015-02-07 10:26:43') 
    (62.3ms) COMMIT 
    (0.3ms) BEGIN 
    (0.1ms) COMMIT 
Redirected to http://localhost/models/2 

그래서 편집 페이지에서 편집/업데이트 리디렉션 만들기 방법을 사용하는 이유는 무엇입니까? 누구든지 도움을받을 수 있습니까? 감사합니다.

답변

1

레일에서 문제를 일으킬 수 있으므로 경로를 두 번 정의하고 있습니까? 한 번만 정의해야합니다.

resources :models do 
    resources :lineitems 
end 

또한 콘솔에서 rake routes을 실행하고 어떤 경로가 형성되는지보십시오.

실제로이 @model.lineitems.build을 사용하는 경우 컨트롤러에서 찾은 @lineitem을 사용해야하는 반면 lineitems 객체는 다시 할당합니다. 그래서 편집에 @lineitem을 사용해야합니다.

+0

안녕 Shobhit, 내가 리소스를 삭제했습니다 : lineitems 리소스 : routes.rb에서 모델, 문제가 여전히 존재합니다. – DarWcy

+0

레이크 루트의 출력을 붙여 넣을 수 있습니까 –

+0

안녕하세요 Shobhit, 질문에 레이크 경로의 출력을 추가했습니다. 제발 좀 봐. – DarWcy