Rails app生成错误:父控制器中的id

时间:2012-07-10 14:16:31

标签: ruby-on-rails-3 controller nested-resources

我首次使用2个资源,部门(部门)和会员创建了一个非常基本的rails应用程序。我相信我已正确使用嵌套资源,但由于某些原因在运行rails服务器之后,父资源的:id未正确生成/传递。 Root是depts #index,从这里我可以使用在新视图和编辑视图中呈现的_form.haml来做新的和编辑。但是,当我执行/ depts / 3时,我收到“无法找到id = 3的dept”的错误。点击编辑索引会给我/ depts / 63 /编辑URL - 我不确定这个id = 63来自哪里。尝试通过在URL中键入/ dept / 63来“显示”操作不起作用。我一开始就创建了Depts,让它与所有的动作和视图一起工作,因为我添加了会员资源,所以出了问题。

的routes.rb

        resources :depts do
  resources :members
end

depts_controller.rb

    def index
        @depts = Dept.all

        respond_to do |format|
          format.html
          format.json { render :json => @depts }
        end
      end

      def show
        @dept = Dept.find(params[:dept_id])

        respond_to do |format|
          format.html
          format.json { render :json => @dept }
        end
      end

      def new
        @dept = Dept.new(params[:dept])

        respond_to do |format|
          format.html
          format.json { render :json => @dept }
        end
      end

      def create
        @dept = Dept.new(params[:dept])

        respond_to do |format|
          if @dept.save
             format.html { redirect_to :action => 'index' }
             format.json { render :json => @dept }
          else
             format.html { render :action => 'new' }
             format.json { render :json => @dept }
          end
        end
      end

      def edit
        @dept = Dept.find(params[:id])
      end

      def update
        @dept = Dept.find(params[:id])

        respond_to do |format|
          if @dept.update_attributes(params[:dept])
             format.html { redirect_to :action => 'index'}#, :id => @dept }
             format.json { render :json => @dept }

          else
             format.html { redirect_to :action => 'edit' }
             format.json { render :json => @dept }
          end
        end
      end

    def destroy
        @dept = Dept.find(params[:id])
        @dept.destroy

        respond_to do |format|
          format.html { redirect_to :action => 'index' }
          format.json { render :json => @dept }
        end
      end
    end

show.haml

    %p= @dept.name

    %p= link_to "back", {:action => 'index'}

index.haml

    %h1 DEPARTMENTS

    %ol
      - @depts.each do |d|
        %li= link_to d.name
        %p= link_to 'edit department', edit_dept_path(d)
        %p= link_to 'get rid of department!', d, :method => :delete, :id => d.id

      %br
    %p= link_to "ADD A NEW DEPARTMENT", new_dept_path

1 个答案:

答案 0 :(得分:0)

显示方法更改

@dept = Dept.find(params[:dept_id])

为:

@dept = Dept.find(params[:id])

并在新方法更改中:

@dept = Dept.new(params[:dept])

只是:

@dept = Dept.new