在 rails 4 上通过 ruby 中的 link_to 方法传递参数
passing parameters through link_to method in ruby on rails 4
我有一个索引视图显示所有可用的 classes 我想要一个 link 到 "sign up for class" 将我重定向到 "sign up" 表单并填写其他一些值,当创建注册时,它会保存我填写的值加上我刚刚通过 link 传递给方法
的 class 的外键
classes索引:
<h1>Listof classes</h1>
<table>
<thead>
<tr>
<th>id</th>
<th>Name</th>
<th>Description</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% @classes.each do |class| %>
<tr>
<td><%= class.id %></td>
<td><%= class.name %></td>
<td><%= class.description %></td>
<td><%= link_to 'sign up!', new_sign_up_path(:class_id => class.id), method: :post %></td>
</tr>
<% end %>
</tbody>
</table>
sign_up 控制器:
class SignUpsCOntroller < ApplicationController
before_action :set_sign_ups, only: [:show, :edit, :update, :destroy]
# GET /sign_ups/new
def new
@sign_up = SignUp.new
end
def set_sign_ups
@sign_up = SignUp.find(params[:id])
end
def sign_up_params
params.require(:sign_up).permit(:date, :status, :type, :class_id)
end
end
和我的注册表单:
<%= form_for(@sign_up) do |f| %>
<div class="field">
<%= f.label :date %><br>
<%= f.date_select :date %>
</div>
<div class="field">
<%= f.label :status %><br>
<%= f.check_box :status %>
</div>
<div class="field">
<%= f.label :type %><br>
<%= f.number_field :type %>
</div>
<div class="field">
<%= f.hidden_field :class_id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
当我保存它时它不保存 class_id...我试过将它解析为整数 我试过没有隐藏字段但它总是将它作为空白传递给保存...有什么想法吗?
您只是在 params[:class_id]
中传递了您在 link_to
上的额外参数。但是,您的表单适用于具有 class_id
属性的对象,因此它期望您的 @sign_up
对象具有 class_id
属性。
基本上,对于您的 new
操作,您需要使用参数中的 class_id
设置 @sign_up
:
def new
@sign_up = SignUp.new
@sign_up.class_id = params[:class_id] if params.has_key?(:class_id)
end
这会将 class_id
设置为从 link_to
url 传入的参数。
那么您的表单应该可以正常工作,因为 f.hidden_field
将查看 @sign_up
上 class_id
的当前值并将其设置为输入值。此时您没有保存它并不重要 - form_for
将使用未保存的状态来填充输入。
我有一个索引视图显示所有可用的 classes 我想要一个 link 到 "sign up for class" 将我重定向到 "sign up" 表单并填写其他一些值,当创建注册时,它会保存我填写的值加上我刚刚通过 link 传递给方法
的 class 的外键classes索引:
<h1>Listof classes</h1>
<table>
<thead>
<tr>
<th>id</th>
<th>Name</th>
<th>Description</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% @classes.each do |class| %>
<tr>
<td><%= class.id %></td>
<td><%= class.name %></td>
<td><%= class.description %></td>
<td><%= link_to 'sign up!', new_sign_up_path(:class_id => class.id), method: :post %></td>
</tr>
<% end %>
</tbody>
</table>
sign_up 控制器:
class SignUpsCOntroller < ApplicationController
before_action :set_sign_ups, only: [:show, :edit, :update, :destroy]
# GET /sign_ups/new
def new
@sign_up = SignUp.new
end
def set_sign_ups
@sign_up = SignUp.find(params[:id])
end
def sign_up_params
params.require(:sign_up).permit(:date, :status, :type, :class_id)
end
end
和我的注册表单:
<%= form_for(@sign_up) do |f| %>
<div class="field">
<%= f.label :date %><br>
<%= f.date_select :date %>
</div>
<div class="field">
<%= f.label :status %><br>
<%= f.check_box :status %>
</div>
<div class="field">
<%= f.label :type %><br>
<%= f.number_field :type %>
</div>
<div class="field">
<%= f.hidden_field :class_id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
当我保存它时它不保存 class_id...我试过将它解析为整数 我试过没有隐藏字段但它总是将它作为空白传递给保存...有什么想法吗?
您只是在 params[:class_id]
中传递了您在 link_to
上的额外参数。但是,您的表单适用于具有 class_id
属性的对象,因此它期望您的 @sign_up
对象具有 class_id
属性。
基本上,对于您的 new
操作,您需要使用参数中的 class_id
设置 @sign_up
:
def new
@sign_up = SignUp.new
@sign_up.class_id = params[:class_id] if params.has_key?(:class_id)
end
这会将 class_id
设置为从 link_to
url 传入的参数。
那么您的表单应该可以正常工作,因为 f.hidden_field
将查看 @sign_up
上 class_id
的当前值并将其设置为输入值。此时您没有保存它并不重要 - form_for
将使用未保存的状态来填充输入。