我对铁杆比较陌生,而且几天来我一直在苦苦挣扎。如果你能看到我出错的地方,我将不胜感激。
当我在网络浏览器中查看该页面时,我收到以下消息:
显示C:/Users/Matt/Documents/GitHub/Outputer/app/views/studies/index.html.erb第8行提出:
#<#:0x6b03808>
的未定义方法`studies_path'8:<%= form_for @new_study do | f | %GT;
studies_controller:
def index
@line = current_user.lines.find_by_id(params[:line_id])
@machine = @line.machines.find_by_id(params[:machine_id])
@studies = @machine.studies.paginate(page: params[:page], :per_page => 10)
@new_study = @machine.studies.build
end
def create
@study = current_user.lines.machines.study.build(params[:study])
if @study.save
flash[:success] = "Study created"
else
flash[:error] = "Error : Invalid study description"
end
redirect_to :back
end
的index.html
....
<section>
<%= form_for @new_study do |f| %>
<div class="field">
<%= f.text_field :description, placeholder: "New study description..." %>
</div>
<%= f.submit "Create", class: "btn" %>
<% end %>
</section>
....
学习模式
....
class Study < ActiveRecord::Base
belongs_to :machine
belongs_to :line
attr_accessible :avg_speed, :avg_uptime, :avg_yield, :description, :duration, :is_active, :start_time, :stop_time, :line_id
validates ....
has_many :events, dependent: :destroy
....
end
....
佣金路线:
....
save_line_machine_study PUT /lines/:line_id/machines/:machine_id/studies/:id/save(.:format) studies#save {:has_many=>:machines}
line_machine_studies GET /lines/:line_id/machines/:machine_id/studies(.:format) studies#index {:has_many=>:machines}
POST /lines/:line_id/machines/:machine_id/studies(.:format) studies#create {:has_many=>:machines}
new_line_machine_study GET /lines/:line_id/machines/:machine_id/studies/new(.:format) studies#new {:has_many=>:machines}
edit_line_machine_study GET /lines/:line_id/machines/:machine_id/studies/:id/edit(.:format) studies#edit {:has_many=>:machines}
line_machine_study GET /lines/:line_id/machines/:machine_id/studies/:id(.:format) studies#show {:has_many=>:machines}
PUT /lines/:line_id/machines/:machine_id/studies/:id(.:format) studies#update {:has_many=>:machines}
DELETE /lines/:line_id/machines/:machine_id/studies/:id(.:format) studies#destroy {:has_many=>:machines}
....
的routes.rb
resources :users
resources :lines, :has_many => :machines, only: [:index, :edit, :destroy, :show, :create] do
resources :machines, only: [:new, :create, :edit, :update] do
resources :studies
end
end
如果我删除表单,页面工作正常,这将表明它在表单中。我已经在控制台中测试了控制器命令,它们都显得很好 - 我可以创建一个新的研究对象。
感谢您的期待
答案 0 :(得分:1)
对模型实例使用form_for
时,默认为该控制器的POST
操作,即studies_path
。这通常映射到控制器中的create
。
从它的外观来看,您需要在routes.rb
中添加一个路径来处理该帖子请求(请参阅参考资料)。您还需要在学习控制器中使用create
方法。
Here是学习轨道路由基础知识的好指南。
答案 1 :(得分:1)
虽然丢失路由是导致该错误(不是非常有用)错误的最常见原因,但如果has_many / belongs_to关系的一方或双方丢失或定义不正确,也会引发错误路由。另一个要查看的地方是相关模型中不存在的属性的表单字段。
答案 2 :(得分:0)
<%= form_for @new_study %>
相当于<%= form_for @new_study, url: studies_url %>
。由于您的路线定义不同,您需要将要提交表单的网址传递给url
参数(在Rails API文档中查找form_for
以查看其他选项)
三级深度嵌套有点难以维护,所以我建议如下:
resources :users
resources :lines do
resources :machines
end
resources :machines do
resources :studies
end
这些shallow
路线维护得更好。嵌套资源调用还有shallow: true
选项,请参阅文档。
在你的情况下:
# With the current setup
<%= form_for @new_study, url: line_machine_studies_path(@line, @machine)
# Same, my preference
<%= form_for [@line, @machine, @new_study] %>
# If you make your routes shallow,
# @line is not nescessary, as @machine holds all information about associations
<%= form_for @new_study, url: machine_studies_path(@machine) %>
# Same, my preference, what I would do
<%= form_for [@machine, @new_study] %>
一般建议:
@study
优于@new_study
。如果需要,@study.new_record?
会告诉您对象是否是新记录。has_many :...
选项rails shallow routes
了解详情。嵌套到两个级别。在创建对象时,只考虑您真正需要的信息,并尽可能保持URL和URL帮助程序的简洁。