无法找到带有' id' = clas的时间表

时间:2015-06-04 04:33:57

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

生成时间表脚手架。然后又创建了一个新动作" clas"在我的timetables_controller.rb。

timetables_controller.rb

class TimetablesController < ApplicationController
before_action :set_timetable, only: [:show, :edit, :update, :destroy, :clas]
def clas
  @classtimetable = Timetable.where(params[:clas])
end

//other actions

def set_timetable
  @timetable = Timetable.find(params[:id])
end

def timetable_params
  params.require(:timetable).permit(:day, :clas, :one_teacher, :one_sub, :two_teacher, :two_sub, :three_teacher, :three_sub, :four_teacher, :four_sub, :five_teacher, :five_sub, :six_teacher, :six_sub, :seven_teacher, :seven_sub, :eight_teacher, :eight_sub)
end
end

为行动创建了form_for&#34; clas&#34;。需要将select选项值作为参数传递给控制器​​

clas.html.erb

<% form_for @classtimetable, :url => clas_timetables_path, :html => { :method => :post} do |f| %>
<div class="field">
  <%= f.label "Select class" %>
  <% values = ["1c", "2c", "3c", "4d", "5i"] %>
  <%= f.select :clas, options_for_select(values) %>
</div>
<div class="actions">
  <%= f.submit "Submit"%>
</div>
<% end %>

<% @classtimetable.each do |class_timetable| %>
<%= class_timetable.day %>
<% end %>

的routes.rb

resources :timetables do
member do
  get 'clas'
end
end

我需要在clas.html.erb页面中全天获取课程。这是通过从下拉列表中选择类并提交来完成的。单击“提交”时,该值应以参数传递。 不知道如何解决它。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

form_for标记

中添加控制器
<% form_for @classtimetable, :url => { :controller => "your-controller-name", :action => :clas } do |f| %>

或者你可以直接这样写,

<% form_for @classtimetable, :url => clas_timetables_path, :html => { :method => :post} do |f| %>

更改before_action之类的,

before_action :set_timetable, only: [:show, :edit, :update, :destroy, :clas]

您可以将collection更改为member并传递id

resources :timetables do
member do
  get 'clas'
end
end

答案 1 :(得分:0)

尝试像这样更改form_tag

<% form_for @classtimetable, :url => clas_timetables_path(@classtimetable), :method => :post do |f| %>

答案 2 :(得分:0)

你能试试吗

$select[]=$selected;

答案 3 :(得分:0)

首先我认识到:你在路线中使用了get,并以形式发布。所以行动不匹配。 第二:你写过:

  

对于Timetable :: ActiveRecord_Relation仍然得到相同的错误未定义方法`model_name':Class

那么看,你如何定义@classtimetable

  @classtimetable = Timetable.where(params[:clas])

这是一个关系,而不是你想通过clas找到的ActiveRecord。错误将在此行中抛出:

<% form_for @classtimetable, :url => clas_timetables_path, :html => { :method => :post} do |f| %>

form_for期望第一个参数是ActiveRecord或类似的东西(至少扩展ActiveModel :: Naming的东西)。由于我没有看到你对时间表的定义,我只是猜测,它有一个名为clas的属性,你想要找到带有clas的时间表等于该表格中的选择。所以它会是:

@classtimetable = Timetable.find_by(clas: params[:clas])

与...相同:

@classtimetable = Timetable.where(clas: params[:clas]).first

要从该Relation获取第一个元素,您尝试使用。

第三:由于你确定你的路由是一个成员路由,它应该在clas_timetable_path中期望一个id。由于你在before_filter中的clas动作中加载了@timetable,我想你想拥有:

<% form_for @classtimetable, :url => clas_timetables_path(@timetable), :html => { :method => :get} do |f| %>