【问题标题】:How do I add child object to parent object in Ruby on Rails如何在 Ruby on Rails 中将子对象添加到父对象
【发布时间】:2017-08-17 15:33:53
【问题描述】:

我对 Rails 很陌生,所以这似乎很容易做到。我通过使用 rails 命令 generate scaffold workout name 创建了一个 workout 资源。然后我用rails g model workout_id 创建了一个rails 模型。之后,我将has_many 添加到workout,并将belongs_to 添加到weeks

class Workout < ApplicationRecord
has_many :week
end

class Week < ApplicationRecord
belongs_to :workout
end

我想要做的就是点击workout/show 页面上的按钮/链接,将添加到特定的锻炼时间>。 最好的方法是将 addPages 操作添加到 workouts 或添加到 weeks 类的操作?我希望显示页面以适当的周数重新加载自身更新。我试过类似的东西

def addWeek
@week = Week.create()
@workout.week << @week
end

但我遇到了一些错误。

【问题讨论】:

  • 你可以简单地做@workout.weeks.create(attr1: value1, attr2: value2)或其他方式(有点混乱):Week.create(attr1: value1, attr2: value2, workout: @workout)
  • 这是正确的,那么我将如何路由此操作?使用看跌期权?
  • 动作目的和HTTP动词的映射如下:Creation => POST, Update => PUT (or PATCH), destroy => DELETE, retrieve (read) => GET (@ 987654321@)
  • 我已经使用 put 路由了操作,然后将按钮与 addWeek_workout_path 链接,但是我得到 No route matches [GET] "/workouts/1/addWeek",有什么建议吗?
  • 请求以 GET 形式发送,使用 method: :post 作为 link_to / button_to 的参数(请参阅文档中的 Destroy 操作示例:apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

标签: ruby-on-rails class model-view-controller


【解决方案1】:

路线

resources :workouts do
  post :addWeek, on: :member
end

查看

= link_to "Add", add_week_workout_path(@workout), method: :post

控制器

def add_week
  @workout.weeks << Week.create
end

型号

class Workout < ApplicationRecord
  has_many :weeks
end

class Week < ApplicationRecord
  belongs_to :workout
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多