新手问题 关于一对多模型关联中,子模型记录的编辑功能的实现。

fengfans · 2018年02月11日 · 最后由 fengfans 回复于 2018年02月11日 · 1178 次阅读

需要建立两个模型,模型 1 为 sport,记录 30 天的体育活动完成情况

模型 2 为 activity,记录当天完成的活动有哪些?具体成绩如何。当前 view 对应的是 sport_controller 中的 show 这个 action。 求教大家,如何在第二个图的界面中实现编辑当前体育活动功能?

模型关联定义如下 sport 模型中 has_many :activities

activity 模型中 belongs_to :sport

问题清单: sport_controller 中的 show 这个 action 的代码如下:

def show
    console
    @sport = Sport.find(params[:id])
    @activities = @sport.activities
  end

view 的代码如下:

<% @activities.each do |a| %>
   <tr>
     <td><%= a.acname  %></td>
     <td><%= a.actime.to_s %></td>
     <td><%= a.grading %></td>
     <td><%= a.unit %></td>
     <td>
       <%= link_to("编辑",edit_sport_activity_path(a)) %>
     </td>
   </tr>
   <% end %>

编辑链接中,使用 edit_sport_activity_path(a) 不好用。这块应该如何写,才参在 activity 控制器的 edit 模板中,实现某一活动记录的内容编辑。

我现在最困惑的问题是,通过 link_to("编辑",edit_sport_activity_path(a)) 这个方法,如何把其所在的记录中 activity 实例的 ID 编号传给 activity 的 edit 视图,用 a 这个本地变更肯定不行,用@activities这个实例变量,由于没有这个 ID,没法定位这个实例,生成 edit 模板。

不知道是哪里了错了,怎么解决也没有思路。

accepts_nested_attributes_for

你是要这个?

<%= link_to("编辑",edit_sport_path(a.sport_id)) %>
guyanbiao 回复

要的是 acvitity 的 id,但传的都是 sport_id。我试试三楼朋友的方法。

因为,edit_sport_activity_path(sport_id, activity_id) 方法第二个参数才是 activity_id。所以你的 view 中改成 edit_sport_activity_path(@sport, a) 就行了。

这里 @sport 这个参数没有什么意义,但也要留一个占位,如果想修改 activity 不传这个参数,可以在路由中生成 edit_activity_path 方法,按照这里的文档设置 route:http://guides.rubyonrails.org/routing.html#shallow-nesting

pinewong 回复

Showing /Users/f/Documents/RailsProject/wvhomework/app/views/activities/edit.html.erb where line #3 raised:

undefined method `activity_path' for #<#Class:0x007fbec5a94558:0x007fbed1782318> Extracted source (around line #3): 1 2 3 4 5 6

编辑当前活动

<%= @activity.acname %> <%= form_for @activity do |s| %> <%= s.text_field :acname %>
<%= s.text_field :actime %>
<%= s.text_field :grading %>

Rails.root: /Users/f/Documents/RailsProject/wvhomework

Application Trace | Framework Trace | Full Trace app/views/activities/edit.html.erb:3:in `app_views_activities_edit_html_erb__2632607414439202350_70228735337840' Request

Parameters:

{"sport_id"=>"#Activity::ActiveRecord_Associations_CollectionProxy:0x007fbecea90c10", "id"=>"7"}

fengfans 回复

你这个是不是编辑页已经没问题,然后点保存的时候出的问题?根据报错信息,你想用 form_for @activity 这个 helper 的话,要在路由中加一句 resources :activities 才行

fengfans 回复

我粗略的看了一下 你的问题在于没有理解 资源 这个概念

你的第二张图对应的路由应该是

GET /sports/:sport_id/activities

也就是说对应的是 activities 的 index

pinewong 回复

成功了,十分感谢。有两个问题请教: 1、再增加 resources :activities 会不会引发安全风险。 2、关于这个模型关联的问题,我查阅了模型关联文档、form_for 的参数文档,就没有找到这个(@sport,a) 写法的表述。我一直都是在类似这种综合性的问题上卡住,针对类似这样规模的问题,有没有比较系统的资料、书可以借鉴参考。

so_zengtao 回复

我是想在 sport 的 show 模板上直接就添加相关的活动了,而不是要跳转到 activity 的 index 上再进行添加。您的建议是如何设计?

fengfans 回复

第一个问题看我 #6 提到的文档解决; 第二个是因为这种路由方法是动态方法,文档不好查。edit_sport_activity_path 需要 sport、activity 两个参数,和 edit_activity_path 需要 activity 一个参数的问题,这个是 Rails 默认对资源的约定,记下来就好了。

最系统、最好用的资源就是Rails Guides 中文

pinewong 回复

谢谢指教,我试着看过指南,只是看过了,好像也没有记下什么,用的时候才发现有些内容印象不深。是不是要反复看多遍,还是边实践边看?

fengfans 回复

我是先全部过一遍,之后遇到问题,再回到那些模糊的知识点里回顾。有些不太好理解的地方,有时也反复翻了好多遍现在才记下来

好的,谢谢指点。接下来的假期我就慢慢的读一遍

需要 登录 后方可回复, 如果你还没有账号请 注册新账号