我正在通过编写简单的TODO任务应用程序来学习Rails.
两种型号是:
两种型号是:
- class List < ActiveRecord::Base
- has_many :tasks,:dependent => :destroy
- # ...
- end
- class Task < ActiveRecord::Base
- belongs_to :list
- # ...
- end
任务在列表下作为嵌套资源进行路由.因此,当用户创建新任务时,POST消息将发送到/ lists /:list_id / tasks.到目前为止,在Tasks#new view的形式中有
- f.hidden_field :list_id,:value => params[:list_id]
但这是一个可怕的解决方案,因为任何人都可以改变隐藏领域的价值.
这里的约定是什么?我应该把类似的东西
- @task.list_id = params[:list_id]
在任务#创建动作并摆脱隐藏的字段,或者也许
- @task = List.find(params[:list_id]).tasks.new(params[:task])
- if @task.save
- # ...
- end
或者甚至有更好的方式我不知道?
编辑:
是的,那里有similar question,它的答案几乎涵盖了我的问题.如果您有不同的请发布.
解决方法
你是对的 – 那太可怕了.不需要隐藏的字段.像下面这样的东西.
在您的TasksController中:
- def new
- @list = List.find(params[:list_id])
- @task = @list.tasks.build
- end
- def create
- @list = List.find(params[:list_id])
- @task = @list.tasks.new(params[:task])
- # etc
- end
在Task#new视图中:
- <% form_for [@list,@task] ... %>
- ...
- <% end %>