我想要实现的是将每个成员列入学校,然后列出所有成员的学校。学校可以有很多成员,成员也可以有很多学校。我在系统中进行了以下设置,但在找到解决方案时遇到了问题。这是我的代码的样子:
控制器:
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 :(得分: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
如果没有会员学校,这会引发错误。