访问和编辑 rails 中的关联数据
Accessing and editing associated data in rails
我有两个 table,一个叫做事件,另一个叫做会话。可以有多个具有相同 session_name 的事件,但每个事件只会有一个 session_name
class Session < ApplicationRecord
belongs_to :event, foreign_key: 'session_id'
end
class Event < ApplicationRecord
has_one :session
end
我不太确定如何设置 belongs_to 和 has_one。我试过查看教程和其他示例,但它们都与我所拥有的有所不同。
在 form_for 事件中,我怎样才能找到或创建新的 session_name 并且 session_id 获得正确的 ID
在我的控制器中,我为我的编辑表单尝试了这个,但这只显示了事件的 ID,而不是会话
def edit
@events = Event.find(params[:format])
@session = @events.session.id
end
我知道这很多,任何帮助或指导都会很合适,我一直试图解决这个问题,在数据库和 activerecord 方面我不是最棒的。我感谢任何批评只是不要对此是个混蛋。
更新
我得到了要显示的编辑和新表格,但我如何 save/update 将它添加到数据库中。这是我的表格。用户将填写的会话 table 中的唯一字段是 session_name。当他们点击 save/update 时,我需要事件 table 来查找或创建 sessions.id 并将其插入 events.session_id.
<%= form_for @session,html:{ class:'form-horizontal', style:'color:white;margin:auto;'}, url: signup_path do |s| %>
<%= s.fields_for :event do |e| %>
<label class="col-form-label">Event:</label>
<%= e.select(:eventname, [['Pink Ribbon Invite'],['2018 Missouri State Championship - KC']],{ :include_blank => false }, class: 'form-control')%>
<label class="col-form-label">First Name:</label>
<%= e.text_field(:firstname, class: 'form-control') %>
<label class="col-form-label">Last Name: </label>
<%= e.text_field(:lastname, class: 'form-control') %>
<label class="col-form-label">Phone Number: </label>
<%= e.telephone_field(:phone, class: 'form-control') %>
<label class="col-form-label">Email: </label>
<%= e.email_field(:email, class: 'form-control') %>
<label class="col-form-label">Street Address:</label>
<%= e.text_field(:streetaddress1, class: 'form-control') %>
<label class="col-form-label">Street Address 2: </label>
<%= e.text_field(:streetaddress2, class: 'form-control') %>
<label class="col-form-label">City:</label>
<%= e.text_field(:city, class: 'form-control') %>
<label class="col-form-label">State: </label>
<%= e.text_field(:state, class: 'form-control') %>
<label class="col-form-label">Zip:</label>
<%= e.text_field(:zip, class: 'form-control') %>
<label class="col-form-label">Gymnast</label>
<%= e.text_field(:gymnast, class: 'form-control') %>
<label class="col-form-label">Team Gym</label>
<%= e.text_field(:gym, class: 'form-control') %>
<label class="col-form-label">Session</label>
<%= s.text_field(:session_name, class: 'form-control') %>
<label class="col-form-label">Level</label>
<%= e.text_field(:level, class: 'form-control') %>
<label class="col-form-label">Product</label>
<%= e.select(:product, [["Digital - "],["Flash Drive - 0"],["Team Registration - 0"]], {} ,class: 'form-control') %>
<%= e.check_box(:terms, class:'') %>
<%= link_to 'Terms and Conditions', '#', data:{target: '#termsmodal', toggle: 'modal'}%>
<% end %>
<div>
<%= s.submit 'Sign Up', class:'btn btn-primary' %>
</div>
<% end %>
def new
@session = Session.new()
@session.build_event
end
def create
@session = Session.find_or_create_by(session_name:
params[:session_name])
@event = @session #This is where i'm confused
@event.new(session_params)
if @session.save
flash[:success] = "You have successfully signed up"
redirect_to signup_path
else
render 'signup'
end
end
def edit
@events = Event.find(params[:format])
@session = Session.find(@events.session_id)
end
def update
puts params.inspect
@events = Event.find(params[:event][:id])
if @events.update_attributes(event_params)
redirect_to event_path
else
render 'edit'
end
end
首先你的联想是错误的。使用 reference
建模(在您的情况下为 session_id
)总是 belongs_to
某些东西。所以你应该有
Event
中的 belongs_to :session
和 Session
中的 has_one :event
。
要构建正确的表单,您应该使用嵌套属性。你可以看例子Here。
一般形式应该是这样的。
<%= form_for(@session) do |f| %>
...
<%= f.fields_for :event do |builder| %>
<%= builder.label :some_field, "Some field" %><br />
<%= builder.text_field :some_field %><br />
...
<% end %>
...
<% end %>
不要忘记在Session
中添加accepts_nested_attributes_for :event
我有两个 table,一个叫做事件,另一个叫做会话。可以有多个具有相同 session_name 的事件,但每个事件只会有一个 session_name
class Session < ApplicationRecord
belongs_to :event, foreign_key: 'session_id'
end
class Event < ApplicationRecord
has_one :session
end
我不太确定如何设置 belongs_to 和 has_one。我试过查看教程和其他示例,但它们都与我所拥有的有所不同。
在 form_for 事件中,我怎样才能找到或创建新的 session_name 并且 session_id 获得正确的 ID
在我的控制器中,我为我的编辑表单尝试了这个,但这只显示了事件的 ID,而不是会话
def edit
@events = Event.find(params[:format])
@session = @events.session.id
end
我知道这很多,任何帮助或指导都会很合适,我一直试图解决这个问题,在数据库和 activerecord 方面我不是最棒的。我感谢任何批评只是不要对此是个混蛋。
更新
我得到了要显示的编辑和新表格,但我如何 save/update 将它添加到数据库中。这是我的表格。用户将填写的会话 table 中的唯一字段是 session_name。当他们点击 save/update 时,我需要事件 table 来查找或创建 sessions.id 并将其插入 events.session_id.
<%= form_for @session,html:{ class:'form-horizontal', style:'color:white;margin:auto;'}, url: signup_path do |s| %>
<%= s.fields_for :event do |e| %>
<label class="col-form-label">Event:</label>
<%= e.select(:eventname, [['Pink Ribbon Invite'],['2018 Missouri State Championship - KC']],{ :include_blank => false }, class: 'form-control')%>
<label class="col-form-label">First Name:</label>
<%= e.text_field(:firstname, class: 'form-control') %>
<label class="col-form-label">Last Name: </label>
<%= e.text_field(:lastname, class: 'form-control') %>
<label class="col-form-label">Phone Number: </label>
<%= e.telephone_field(:phone, class: 'form-control') %>
<label class="col-form-label">Email: </label>
<%= e.email_field(:email, class: 'form-control') %>
<label class="col-form-label">Street Address:</label>
<%= e.text_field(:streetaddress1, class: 'form-control') %>
<label class="col-form-label">Street Address 2: </label>
<%= e.text_field(:streetaddress2, class: 'form-control') %>
<label class="col-form-label">City:</label>
<%= e.text_field(:city, class: 'form-control') %>
<label class="col-form-label">State: </label>
<%= e.text_field(:state, class: 'form-control') %>
<label class="col-form-label">Zip:</label>
<%= e.text_field(:zip, class: 'form-control') %>
<label class="col-form-label">Gymnast</label>
<%= e.text_field(:gymnast, class: 'form-control') %>
<label class="col-form-label">Team Gym</label>
<%= e.text_field(:gym, class: 'form-control') %>
<label class="col-form-label">Session</label>
<%= s.text_field(:session_name, class: 'form-control') %>
<label class="col-form-label">Level</label>
<%= e.text_field(:level, class: 'form-control') %>
<label class="col-form-label">Product</label>
<%= e.select(:product, [["Digital - "],["Flash Drive - 0"],["Team Registration - 0"]], {} ,class: 'form-control') %>
<%= e.check_box(:terms, class:'') %>
<%= link_to 'Terms and Conditions', '#', data:{target: '#termsmodal', toggle: 'modal'}%>
<% end %>
<div>
<%= s.submit 'Sign Up', class:'btn btn-primary' %>
</div>
<% end %>
def new
@session = Session.new()
@session.build_event
end
def create
@session = Session.find_or_create_by(session_name:
params[:session_name])
@event = @session #This is where i'm confused
@event.new(session_params)
if @session.save
flash[:success] = "You have successfully signed up"
redirect_to signup_path
else
render 'signup'
end
end
def edit
@events = Event.find(params[:format])
@session = Session.find(@events.session_id)
end
def update
puts params.inspect
@events = Event.find(params[:event][:id])
if @events.update_attributes(event_params)
redirect_to event_path
else
render 'edit'
end
end
首先你的联想是错误的。使用 reference
建模(在您的情况下为 session_id
)总是 belongs_to
某些东西。所以你应该有
Event
中的 belongs_to :session
和 Session
中的 has_one :event
。
要构建正确的表单,您应该使用嵌套属性。你可以看例子Here。
一般形式应该是这样的。
<%= form_for(@session) do |f| %>
...
<%= f.fields_for :event do |builder| %>
<%= builder.label :some_field, "Some field" %><br />
<%= builder.text_field :some_field %><br />
...
<% end %>
...
<% end %>
不要忘记在Session
accepts_nested_attributes_for :event