如何从form_tag将参数传递给控制器​​方法

时间:2015-04-21 22:09:50

标签: ruby-on-rails forms ruby-on-rails-4

在我的用户显示视图中:

<%= 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 %>

1 个答案:

答案 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" }

价: http://ruby-doc.org/core-2.2.0/Hash.html