ruby-on-rails - 在 Rails 中的 Controller 之间传递 ID 时遇到问题

标签 ruby-on-rails controller routes

我有一个网络应用程序,它具有三个模型 - 客户、工作和房间。

这三个模型的关联如下:

class Customer < ActiveRecord::Base
  has_many :jobs
end

class Job < ActiveRecord::Base
  belongs_to :customer
  has_many   :rooms
end

class Room < ActiveRecord::Base
  belongs_to :job
end

我的问题如下:

  • 保存新房间后,我想重定向到与该职位对应的路径,例如/customer/1/jobs/3。
  • 客户 ID 未传递到新房间操作的参数中。

以下是我在 Rooms Controller 中的新操作和创建操作:

def new
  @customer = Customer.find(params[:customer_id])
  @job = Job.find(params[:job_id])
  @room = @job.rooms.build
end

def create
  @customer = Customer.find(params[:customer_id])
  @job = Job.find(params[:job_id])
  @room = @job.rooms.build(room_params)

  respond_to do |format|
    if @room.save
      format.html { redirect_to job_path(@job), notice: 'Room was successfully created.' }
      format.json { render action: 'show', status: :created, location: @room }
    else
      format.html { render action: 'new' }
      format.json { render json: @room.errors, status: :unprocessable_entity }
    end
  end
end

我收到以下错误:

Couldn't find Customer without an ID

在参数中我看到以下内容:

{"job_id"=>"3", "format"=>"1"}

我对这里发生的事情感到困惑 - 有谁知道我如何将客户 ID 从作业 View 传递到房间保存,然后使用该客户 ID 重定向到适当的路径?

如果这很复杂,我很抱歉,我花了几个小时努力思考如何提出这个问题。如果您需要一些,请要求澄清。


Routes.rb 文件:

resources :customers do
  resources :jobs
end

resources :jobs do
  resources :rooms
end

devise_for :users

devise_scope :user do
  root :to => "devise/sessions#new"
end

新房间表格:

<div class="panel panel-primary">
  <div class="panel-heading">
    <h3 class="panel-title center">Add New Room</h3>
  </div>
    <div class="panel-body">

        <%= simple_form_for([@job, @room], html: {class:'form-horizontal'}, wrapper: :horizontal_form) do |f| %>
          <div class="form-inputs">
            <div class="col-md-12">
                <h3 class="bump-right-two"><u>Room Details</u></h3>
            </div>
            <%= f.input :room_type, collection: ["Kitchen", "Bathroom", "Closet", "Island", "Bar", "Furniture", "Laundry Room", "Office", "Miscellaneous", "Custom Order"], prompt: "Select Room Type" %>
            <%= f.input :material, collection: ["Maple", "Cherry", "Oak", "Hickory", "Walnut", "Bamboo", "Thermowrap", "Melamine", "Olon", "Custom Material"], prompt: "Select Material Type" %>
            <%= f.input :material_details %>
            <%= f.input :exterior_colour %>
            <%= f.input :interior_colour, collection: ["White", "Classic Maple", "Dark Truffle", "Caramel", "Stained", "Pre-finished Plywood"], prompt: "Select Interior Colour" %>
            <%= f.input :panel_back_style, collection: ["Veneer", "Door Style", "Melamine"], prompt: "Select Panel Back Style" %>
            <%= f.input :finished_ends, collection: ["Veneer", "Door Style", "Melamine"], prompt: "Select Finished End Material" %>

            <div class="col-md-12">
                <hr class="style-one" />
                <h3 class="bump-right-two"><u>Door Style Details</u></h3>
            </div>

                <%= f.input :upper_door_style %>
                <%= f.input :lower_door_style %>
                <%= f.input :drawer_front_style %>

            <div class="col-md-12">
                <hr class="style-one" />
                <h3 class="bump-right-two"><u>Drawer Box Details</u></h3>
            </div>

            <%= f.input :drawer_box_style, collection: ["Dovetail", "Melamine", "Hettich"], prompt: "Choose Drawer Box Style" %>
            <%= f.input :track_style, collection: ["Tandem", "Hettich", "Accuride"], prompt: "Choose Track Style" %>

            <div class="col-md-12">
                <hr class="style-one" />
                <h3 class="bump-right-two"><u>Counter Top Details</u></h3>
            </div>              

            <%= f.input :counter_top_material, collection: ["Granite", "Quartz", "Corian", "Laminate", "Marble", "Other"], prompt: "Select Counter Top Material" %>
            <%= f.input :counter_top_supplier, collection: ["Rosehill", "Floform", "Granite Mountain"], prompt: "Select Counter Top Supplier" %>
            <%= f.input :counter_top_colour %>
            <%= f.input :counter_top_edge %>
            <%= f.input :backsplash, collection: ["Yes", "No"], prompt: "Select Backsplash" %>
            <%= f.input :sink_install, collection: ["Yes", "No"], prompt: "Select Sink Install" %>

            <div class="col-md-12">
                <hr class="style-one" />
                <h3 class="bump-right-two"><u>Molding Details</u></h3>
            </div>

            <%= f.input :closed_to_ceiling, collection: ["Yes", "No"], prompt: "Select Closed to Ceiling" %>
            <%= f.input :crown_molding %>
            <%= f.input :under_cabinet_molding %>

            <div class="col-md-12">
                <hr class="style-one" />
                <h3 class="bump-right-two"><u>Custom Order Details</u></h3>
            </div>

            <%= f.input :order_name %>
            <%= f.input :order_description %>
          </div>

          <div class="form-actions">
            <%= f.button :submit, "Create New Room", class: "col-md-3 bump-right-two" %>
          </div>
        <% end %>
    </div>
</div>

最佳答案

rooms 是嵌套在 jobs 中的资源:

resources :jobs do
  resources :rooms
end

因此,当您导航到 RoomsController#new 时,您有一个 job_id 参数,因为 rooms 嵌套在 jobs.但路由中没有 customer_id 参数,因为 customers 不是嵌套的一部分。由于 params[:customer_id]nil,因此您会收到错误。

由于作业属于客户,因此您可以简单地通过 Controller 中的作业获取客户:

def new
  @job      = Job.find(params[:job_id])
  @customer = @job.customer
  @room     = @job.rooms.build
end

关于ruby-on-rails - 在 Rails 中的 Controller 之间传递 ID 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775044/

相关文章:

html - ruby rails : Adding a second custom view to a controller (Rails 3)

javascript - 如何正确地与另一个 Controller 管理的 View 交互?

c# - 如何使/Home/Index重定向到/

symfony - Symfony2 路由中的两个可选变量

javascript - 如何将 javascript 变量传递到 js View 中的 erb 代码中?

ruby-on-rails - 我如何跳过实际回调

ruby-on-rails - 发送纯文本时的 ActionController::UnknownFormat

ruby-on-rails - rails 3 - belongs_to :uniqueness

php - 拉维尔 : How to update data in one to one Eloquent relationship

php - Symfony 4 不 Autowiring 动态路由 Controller