问题和错误消息:无法找到带有' id' =的学校

时间:2017-03-03 12:17:29

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

我想要实现的是将每个成员列入学校,然后列出所有成员的学校。学校可以有很多成员,成员也可以有很多学校。我在系统中进行了以下设置,但在找到解决方案时遇到了问题。这是我的代码的样子:

控制器:

class MembersController < ActionController::Base
  before_action :set_school

  def index
    @members = Member.all
  end

  def new
    @member = Member.new
  end

  def create
    @member = Member.new(member_params)
    @member.school = @school 
    @member.save
    redirect_to members_path
  end


  private

  def set_school
    @school = School.find(params[:school])
  end

  def member_params
    params.require(:member).permit(:name, :email,:school)
  end
end

这是我的路线:

Rails.application.routes.draw do
  get 'schools/index'

  resources :members
  resources :school

end

我的观点如下:

<% @members.each do |member| %>
  <%= member.name %>
  <%= member.email %>
  <%= member.school %>
<% end %>

成员模型:

class CreateMembers < ActiveRecord::Migration[5.0]
  def change
    create_table :members do |t|
      t.string :name
      t.string :email
      t.timestamps
    end
  end

我的学校模特:

class CreateSchools < ActiveRecord::Migration[5.0]
  def change
    create_table :schools do |t|
      t.string :name

      t.timestamps
    end

和参考:

class AddSchoolRefToMembers < ActiveRecord::Migration[5.0]
  def change
    add_reference :members, :school, foreign_key: true
  end

任何帮助都会很棒!谢谢!

3 个答案:

答案 0 :(得分:2)

<%= simple_form_for [@member] do |f| %>
  <%= f.input :name %> 
  <%= f.input :email %> 
  <%= f.collection_select :school_id, School.all, :id, :name %> 
  <%= f.submit %> 
<% end %>

更改强力参数

def member_params
  params.require(:member).permit(:name, :email, :school_id)
end

您可以删除before_action :set_school

此外,您需要更改操作,因为school_id已在params中

def create
  @member = Member.create(member_params)
  redirect_to members_path
end

答案 1 :(得分:2)

您已为控制器中的所有操作设置了before_action。因为,index和new没有school_id,所以你必须只为create创建before_action。

更改以下代码

before_action :set_school

before_action :set_school, only: ['create']

答案 2 :(得分:0)

@imocsari获取学校名称改变您的观点,如

<% @members.each do |member| %>
 <%= member.name %>
 <%= member.email %>
 <%= member.school.try(:name) %>
<% end %>

member.school会为您提供相关学校的所有专栏,如果您想显示学校名称member.school.try(:name) or member.school.name

member.school.try(:name)如果没有任何学校成员,这将返回nil,它将通过例外

member.school.name如果没有会员学校,这会引发错误。