使用belongs_to关联将隐藏字段放入资源的表单中的任何方式

Tom*_*iło 6 ruby-on-rails

我正在通过编写简单的TODO任务应用程序来学习Rails.两种型号是:

class List < ActiveRecord::Base
  has_many :tasks, :dependent => :destroy
  # ...
end

class Task < ActiveRecord::Base
  belongs_to :list
  # ...
end
Run Code Online (Sandbox Code Playgroud)

任务在列表下作为嵌套资源进行路由.因此,当用户创建新任务时,会POST向其发送消息/lists/:list_id/tasks.到目前为止,在Tasks#new视图的形式中存在

f.hidden_field :list_id, :value => params[:list_id]
Run Code Online (Sandbox Code Playgroud)

但这是一个可怕的解决方案,因为任何人都可以改变隐藏领域的价值.

这里的约定是什么?我应该把类似的东西

@task.list_id = params[:list_id]
Run Code Online (Sandbox Code Playgroud)

Tasks#create行动和摆脱隐藏的领域,或许

@task = List.find(params[:list_id]).tasks.new(params[:task])
if @task.save
  # ...
end
Run Code Online (Sandbox Code Playgroud)

或者甚至有更好的方式我不知道?

编辑:
是的,有类似的问题,其答案几乎涵盖了我的问题.如果您有不同的请发布.

bjg*_*bjg 9

你是对的 - 那太可怕了.不需要隐藏的字段.像下面这样的东西.

在你的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
Run Code Online (Sandbox Code Playgroud)

在你Task#new看来:

<% form_for [@list, @task] ... %>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)