【问题标题】:How to contruct 'new' in assciated controller in rails 3.1如何在 Rails 3.1 的关联控制器中构造“新”
【发布时间】:2011-12-25 15:28:11
【问题描述】:

我在 rails 3.1 应用程序中有两个模型:lease_booking 和lease_log。 Lease_booking has_many lease_logs 和lease_log 属于_tolease_booking。在 routes.rb 中,关联是:

resources :lease_bookings do
  resources :lease_logs
end 

在lease_booking show.html.erb中,新建租约日志的路径为:

<%= link_to "new Log", new_lease_booking_lease_log_path(@lease_booking) %>

lease_log 控制器中的“新”代码是:

  def new
    @lease_log = LeaseBooking.find(params[:id]).lease_log.new()
  end

但是在点击“新日志”后,lease_log 控制器“新”出现错误:

Couldn't find LeaseBooking without an ID

租赁日志控制器中似乎未正确识别租赁预订的 id(应为 1)。

同一错误页面上的lease booking id(1)是正确的:

Parameters:

{"lease_booking_id"=>"1"}

有办法解决吗?谢谢。

更新:这是 rake 路由的输出

    lease_booking_lease_logs GET    /lease_bookings/:lease_booking_id/lease_logs(.:format)          {:action=>"index", :controller=>"lease_logs"}
                             POST   /lease_bookings/:lease_booking_id/lease_logs(.:format)          {:action=>"create", :controller=>"lease_logs"}
 new_lease_booking_lease_log GET    /lease_bookings/:lease_booking_id/lease_logs/new(.:format)      {:action=>"new", :controller=>"lease_logs"}
edit_lease_booking_lease_log GET    /lease_bookings/:lease_booking_id/lease_logs/:id/edit(.:format) {:action=>"edit", :controller=>"lease_logs"}
     lease_booking_lease_log GET    /lease_bookings/:lease_booking_id/lease_logs/:id(.:format)      {:action=>"show", :controller=>"lease_logs"}
                             PUT    /lease_bookings/:lease_booking_id/lease_logs/:id(.:format)      {:action=>"update", :controller=>"lease_logs"}
                             DELETE /lease_bookings/:lease_booking_id/lease_logs/:id(.:format)      {:action=>"destroy", :controller=>"lease_logs"}

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1


    【解决方案1】:

    您的参数输出显示您应该寻找的参数 -lease_booking_id:

    @lease_log = LeaseBooking.find(params[:lease_booking_id]).lease_log.new()
    

    在控制台中,运行rake routes 以查看嵌套路由如何使用参数。

    编辑:

    当您嵌套路由时,内部资源依赖于外部资源:

    resources :lease_bookings do
      resources :lease_logs
    end
    

    查看rake routes 输出以创建您的lease_log:

    POST   /lease_bookings/:lease_booking_id/lease_logs
    

    因此,当您设置表单时,您需要指定lease_booking 以及新的lease_log(并且任何_path 或_url 方法都需要相应地调整):

    <%= simple_form_for [@lease_booking, @lease_log] do |f| %>
    

    这还需要您在控制器中设置@lease_booking:

    有关 Rails 路由的更多信息,请参阅http://guides.rubyonrails.org/routing.html

    def new
      @lease_booking = LeaseBooking.find(params[:lease_booking_id])
      @lease_log = @lease_booking.lease_log.new
    end
    

    【讨论】:

    • _form_new.html.erb 出现新错误:#:0x5180718> 的未定义方法 `lease_logs_path'。由于关联,rake 路由中没有lease_logs_path。 erb 的第一行是:.
    • 查看下面的链接以获取构建控制器和视图的完整示例。
    【解决方案2】:

    这是我发现的一个完美的例子,可以为一对多关联构建控制器和视图:

    http://jonathanhui.com/ruby-rails-3-model-1-many-association

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多