使用form_tag而不重定向到新页面

时间:2017-05-09 02:25:07

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

由于同一表单中有多个submit_tag,因此我使用send(params[:commit])将submit_tag值传递给所需的操作{action2,action3}。

这里的问题是,我想使用form_tag调用操作而不重定向到新的操作页面。到目前为止,我知道将remote: true插入form_tag可以解决这个问题,但是需要为调用action2或action3做更多的代码(AJAX)。

我想知道,有没有办法在没有重定向到action1.html.erb的情况下调用form_tag,但可以使用send(params[:commit])

在page.html.erb

<%= form_tag "action1" do %>
  <%= text_area_tag :data %>
  <%= submit_tag: action2, remote: true %>
  <%= submit_tag: action3, remote: true %>
<% end %>

在controller.rb

def action1
   send(params[:commit].downcase)
end

def action2
  puts params[:data]
  ...
end

def action3
  puts params[:data]
  ...
end

2 个答案:

答案 0 :(得分:0)

我只是使用case语句并处理action 2或3的返回值。也许是这样的:

def action1
  case params[:commit].downcase
  when action2
    result = action2(params)
  when action3
    result = action3(params)
  end
  # do something with result now
  render result
end

我还会将两个动作移动到控制器内的private

这样就可以完成你想做的事情并避免进行字符串评估。

我希望这会有所帮助

答案 1 :(得分:0)

可以这样做:

class PersonController < ApplicationController

  def action1
    send(parse_action)
    # ...
  end

  def action2
    process_action2
    # ...
  end

  def action3
    process_action3
    # ...
  end

  protected

  def parse_action
    %w{action2 action3}.include?(params[:commit]) ? params[:commit] : 'action2'
  end

  def process_action2
    # do stuff
  end

  def process_action3
    # ... 
  end
end