对于使用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上发表的第一篇文章,如果我遗漏了任何内容(请告诉我)。
答案 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 '/useraccounts
和get /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的帮助。