在我的用户显示视图中:
<%= form_tag assign_as_student_path do %>
<%= hidden_field_tag :user_id, @user.id %>
<%= submit_tag "Assign as a Student", data: { confirm: "Are you sure?" } %>
<% end %>
TeachersController(继承自UsersController):
def assign_as_student
@user = User.find(params[:user_id])
@user.update_attributes(type: "Student")
@user.save
redirect_to admin_path, notice: "They are now a Student"
end
routes.rb中:
post 'assign_as_student' => 'teachers#assign_as_student'
好的,这个工作。但...
这是我必须解决的问题,因为我不知道如何将参数传递给控制器方法。
我想在UsersController中编写一个类似上面的方法,但是有一个这样的参数(我认为这样可行,但是还没有能够测试它):
def assign_as_type(type)
@user = User.find(params[:user_id])
@user.update_attributes(type: type)
@user.save
redirect_to admin_path, notice: "They are now a Student"
end
通过这种方式,我可以只使用这一种方法,而不是使用&#34; assign_as_student&#34;方法和&#34; assign_as_teacher&#34;方法。总是很好干。
所以......我认为上面的方法会起作用,但是如何从表单中传递参数呢?就像下面的表格一样,但添加的内容会传递给字符串&#34;学生&#34;或&#34;老师&#34;:
<%= form_tag assign_as_type_path do %>
<%= hidden_field_tag :user_id, @user.id %>
<%= submit_tag "Assign as a (Student/Teacher), data: { confirm: "Are you sure?" } %>
<% end %>
答案 0 :(得分:1)
(在这个答案中,我假设您使用的是Rails 4+,否则我的一些建议可能不适用,最好在问题中提供。)
要将另一个参数传递给控制器,您可以这样做:
<%= form_tag assign_as_type_path do %>
<%= hidden_field_tag :user_id, @user.id %>
<%= select_tag :type, options_for_select([ "Student", "Teacher" ]) %>
<%= submit_tag "Assign", data: { confirm: "Are you sure?" } %>
<% end %>
然后,该参数可以params[:type]
访问。
由于这是对@user
- 对象的操作,我认为你应该这样做:
<%= form_for @user, url: assign_as_type_path do |f[ %>
<%= f.select :type, options_for_select([ "Student", "Teacher" ],@user.type) %>
<%= f.submit "Assign", data: { confirm: "Are you sure?" } %>
<% end %>
而且在你的控制器中我认为你应该这样做:
(这里假设你改为form_for
)
def assign_as_type(type)
@user = User.find(params[:id])
if @user.update(type: params[:user][:type]) # This sets attribute + saves
redirect_to admin_path, notice: "They are now a " + @user.type
else
redirect_to admin_path, error: "User could not be updated."
end
end
这样,您可以使用模型验证,如果您像在普通更新操作中那样进行重定向,您还可以在表单中显示错误。
希望这有帮助,如果有任何问题,请问
使用params
我理解params的方式(并了解是否有问题)是通过在服务器日志中查看您的最新请求(如果您在本地运行它是您开始的地方rails s
)。
在这里你会看到:
params: { user_id: 1, type: "Student" , commit: "Assign"}
以及其他一些额外参数。
这是一个名为params
的普通Ruby Hash。要使用Ruby语言,您可以执行:http://tryruby.org/教程
如果您将其更改为form_for
,则您的参数哈希将如下所示:
params: { user: { id: 1, type: "Student" }, commit: "Assign" }