我正在Rails 4中编写我的第一个真正的应用程序。这是我的模型......
class Instructor < ActiveRecord::Base
has_many :tickets
end
class Ticket < ActiveRecord::Base
belongs_to :instructor
belongs_to :tutor
end
class Tutor < ActiveRecord::Base
has_many :tickets
end
我通常在控制器中手动设置我的外键关系,就像这样......
def create
@ticket = Ticket.new(ticket_params)
@ticket.instructor = params[:instructor_id]
@ticket.tutor = params[:tutor_id]
...
我过去曾使用过Rails 3的这个约定......但这在Rails 4中不起作用。我猜是因为参数很强。我尝试过使用类似的东西......
@ticket.instructor = ticket_params[:instructor_id]
......但这不起作用。没有错误,没有任何东西得到保存。这是一些控制台输出...
Parameters: {"utf8"=>"✓", "authenticity_token"=>"afnbX2Ph2aaNj7CDnbcDI9EdA74xBBSV7oSoU4uYZ2Y=", "tutor_id"=>{"id"=>"2"}, "ticket"=>{"session_type"=>"Severe", "student"=>"John Q. Student", "student_id"=>"09098", "course_id"=>"English 111", "notes"=>""}, "instructor_id"=>{"id"=>"2"}, "commit"=>"Create Ticket"}
...正如您所看到的那样,教师和导师ID正在参考。但是我在ticket_params上做了一次put / inspect ......
{"session_type"=>"Severe", "student_id"=>"09098", "student"=>"John Q. Student", "course_id"=>"English 111", "notes"=>""}
......并且那里没有教师和导师ID。想法?
在我的控制器中默认创建了ticket_params方法。这是......
def ticket_params
params.require(:ticket).permit(:tutor_id, :session_type, :student_id, :student, :instructor_id, :course_id, :notes)
end
答案 0 :(得分:1)
您需要在控制器中定义一个名为ticket_params
的方法。类似于以下内容
def ticket_params
params.require(:ticket).permit(:name, :date)
end
上述方法基本上告诉控制器它希望存在params[:ticket]
,并且传递给模型的密钥只有:name
和:date
。详细了解github repo
更新:(在问题中添加了ticket_params方法后)
更改
@ticket.instructor = params[:instructor_id]
@ticket.tutor = params[:tutor_id]
到
@ticket.instructor_id = params[:instructor_id][:id]
@ticket.tutor_id = params[:tutor_id][:id]