2017-03-03 57 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如果沒有任何一所學校的成員,這將引發錯誤。