2017-03-03 56 views
0

我想要实现的是列出每个成员与学校,然后列出所有所有成员的学校。学校可以有很多成员,成员也可以有很多学校。我在系统中设置了以下设置,但在找到解决方案时遇到问题。这是我的代码看起来像:问题和错误消息:找不到学校'id'=

控制器:

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 

任何帮助将是巨大的!谢谢!

+0

网址应该如何适合您的新操作?它是'example.com/members/new?school = someid'或只是'example.com/members/new'? – niceman

+0

example.com/members/new – gerazoli

+0

@ashvin'资源:成员'确实允许查询参数:) – niceman

回答

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 %> 

更改强PARAMS

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

而且还可以去除before_action :set_school

您需要更改行动,学校ID已经在PARAMS

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

谢谢迪帕克,但你如何传递价值呢?我的种子文件中有学校的价值 Member.create!([{name:'Star Wars'},{email:'[email protected]'}]) School.create!(name:'威斯敏斯特') School.create(名称:! 'UCL') School.create(名称: '城市') – gerazoli

+0

@imocsari'f.select'会从用户那里获取:) – niceman

+0

学校已编辑答案后PARAMS对于学校将是'params [:成员] [:学校]' – ashvin

2

你有为控制器中的所有操作设置before_action。因为,index和new没有school_id,所以你只能运行before_action来创建。

更改下面的代码

before_action :set_school 

before_action :set_school, only: ['create'] 
+0

OP可能想通过查询参数学校:) – niceman

+0

在创建行动,你必须通过学校in参数。 – puneet18

+0

我改变了它,但现在得到以下内容:未定义的方法'学校='为零:NilClass – gerazoli

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)这将返回零,如果没有为成员任何一所学校,它会通例外

member.school.name如果没有任何一所学校的成员,这将引发错误。