在同一视图中的不同选项卡上设置不同表单的路由

时间:2014-05-06 05:19:01

标签: ruby-on-rails twitter-bootstrap tabs rails-routing

对于使用bootstrap选项卡式导航设置的视图,我需要一些关于设置路由的帮助(我认为这是问题)。我想要做的是在每个标签中设置一个表单。听起来很容易。

但是当你想提交两个不同的动作时,我无法弄清楚路由是如何工作的(一个用于保存到数据库,另一个用于从数据库获取信息),每个来自他们自己的标签。如果我将“get_users”控制器操作视为一个视图,我可以完全正常工作,但是当我尝试将它重新组合在同一页面上时,只是在不同的选项卡中,它有点不对,我不确定如何正确路由。

我有两个控制器动作:

class Users::RegistrationsController < Devise::RegistrationsController

    def user_accounts
        @user = User.new
    end

    def get_users
        @users = User.search(params[:search]).paginate
                (:per_page => 20, :page => params[:page] )
    end
end

编辑 ------------------------------------

包含routes.rb - 排除额外设计相关路线。可以使create_internal_user操作不起作用。我明白路线是 错误,因为铁路永远无法理解它们。第一个是正确的,第二个是我想象的如果可能的话

# Authentication
as :user do

#add new internal users
get '/useraccounts' => 'users/registrations#user_accounts', as: 'new_internal_user'
post '/useraccounts' => 'users/registrations#create_internal_user', as: 'internal_user'

**# searching users - this is where I am uncertain**
get '/useraccounts' => 'users/registrations#get_users', as: 'get_internal_user'
post '/useraccounts' => 'users/registrations#get_users', as: 'getting_internal_user'

# other devise routes here

end

呈现它们的视图看起来像这样并呈现两个部分:

    <div class="container">
     <h1>User Accounts</h1>
     <ul class="nav nav-tabs">
      <li class="active"><a href="#adduser" data-toggle="tab">Add User</a></li>
      <li><a href="#getusers" data-toggle="tab">Edit User</a></li>
     </ul>
     <!-- Tab panes -->
     <div class="tab-content">
      <div class="tab-pane fade in active" id="adduser">
       <%= render 'users/registrations/create_internal' %>
     </div>
      <div class="tab-pane fade in" id="getusers">
       <%= render 'users/registrations/get_users' %>
     </div>
    </div>
   </div>

两个部分

_create_internal.html.erb

    <%= form_for(resource, as: resource_name, 
                 url: new_internal_user_path(resource_name)) do |f| %>
      <div><%= f.label :email %><br />
    <% for role in User::ROLES %>
        <%= check_box_tag "user[roles][#{role}]", role, 
                        @user.roles.include?(role), 
                        {:name => "user[roles][]"}%>

        <%= label_tag "user_roles_#{role}", role.humanize %><br />
    <% end %>
    <%= hidden_field_tag "user[roles][]", "" %>
    <div class="col-md-10 center"><%= f.submit "Create User", 
                 class: "btn btn-primary"%></div>
<% end %>

_get_users.html.erb

  <%= form_tag({:controller => "users/registrations", :action => "get_users"},
                method: :get) do %>    
<p>  
  <%= text_field_tag :search, params[:search] %>  
  <%= submit_tag "Search", :name => nil %>  
</p>
  <% end %>
  <div class="center" id="users">
  <%  if defined?(@users) %>
  <%= render 'users/registrations/searchresults' %></div>
  <%=  will_paginate @users %> 
<% end %> 

我花了很多时间试图解决这个问题,但却无法做到。对Rails来说很新,所以对某人来说这可能是一个简单的问题。我已经看过使用AJAX和资源丰富的路由,但是因为我还是新手,所以我发现它有点难以一次性地绕过它。这是我在SO上发表的第一篇文章,如果我遗漏了任何内容(请告诉我)。

3 个答案:

答案 0 :(得分:0)

让我们说你的控制器是UsersController并假设你的路由没有嵌套,这就是你创建命名路由的方式:

get '/useraccounts', to: 'users#get_users' ## this route maps to the get_users action 

post '/useraccounts' to: 'users#create_internal_user'  # this route maps to the create_internal_user action 

编辑: 格式为controller_name#action_name。因此,请确保将users替换为多个控制器名称

更新:

如果您的控制器名称为RegistrationsController

尝试:

 get '/useraccounts', to: 'registrations#get_users'

post '/useraccounts' to: 'registrations#create_internal_user'

答案 1 :(得分:0)

观察它,我认为您的错误可能来自您的_get_users.html.erb部分。

首先,您使用的是form_for - 为什么?您对form_for的使用基本上意味着您必须使用@user中的数据才能使其正常工作,我认为这将导致问题

我会使用form_tag,因为这不会保留您的数据:

<%= form_tag({:controller => "users/registrations", :action => "get_users"}, method: :get) do %>   
  <%= text_field_tag :search, params[:search] %>  
  <%= submit_tag "Search", :name => nil %>  
<% end %>

<%  if defined?(@users) #-> this might need to be passed as a local var %>
  <%= render 'users/registrations/searchresults' %></div>
  <%=  will_paginate @users %> 
<% end %> 

<强>路线

您的其他问题与您的routes

有关
get '/useraccounts' => 'users/registrations#user_accounts', as: 'new_internal_user'
post '/useraccounts' => 'users/registrations#create_internal_user', as: 'internal_user'

**# searching users - this is where I am uncertain**
get '/useraccounts' => 'users/registrations#get_users', as: 'get_internal_user'
post '/useraccounts' => 'users/registrations#get_users', as: 'getting_internal_user'

告诉我您希望Rails如何知道get '/useraccountsget /useraccounts 之间的区别?事实是它不能

您需要拆分路线,以便它们不会全部使用相同的路径。我会这样做:

get '/useraccounts' => 'users/registrations#user_accounts', as: 'new_internal_user'
post '/useraccounts' => 'users/registrations#create_internal_user', as: 'internal_user'

**# searching users - this is where I am uncertain**
get '/search' => 'users/registrations#get_users', as: 'get_internal_user'

答案 2 :(得分:0)

经过多次挫折之后,我解决了自己的问题。在Rich Peck的帮助下,我意识到我实际上是在创建一个包含两个表单的视图,并且选项卡式导航对问题并没有任何意义。

所以我真的只需要这两条路线:

# #add new internal users
get '/useraccounts' => 'users/registrations#user_accounts', as: 'user_accounts'
post '/useraccounts' => 'users/registrations#create_internal_user', as: 
                                                 'create_internal_user'

然后在控制器中将user_accounts操作更改为如下所示:

def user_accounts
    @user = User.new
    if params[:search_button]
        @users = User.search(params[:search]).paginate(:per_page => 15, :page => params[:page] )
    end
end

感谢这个问题/答案: form_for with multiple controller actions for submit

最终问题不是我认为的那样,最终变得简单。当然是一个有趣的学习之旅。再次感谢Rich Peck的帮助。