这是我的第一个Rails应用程序,并打了另一面墙。我有一个用户模型和一个国家模型。他们有多对多的关系,我和Trip模型一起加入。
用户可以维护他们去过的国家/地区列表。在“国家/地区”页面上,我想要一个简单的引导按钮,以便current_user可以在其列表中添加或删除国家/地区。
我使用的部分看起来如下,至少在所有页面上渲染按钮。
_add_remove_countries.html.erb
<% if @user.countries.exists?(@country.id) %>
<%= form_for(@user) do |f| %>
<%= f.submit "Remove Country", class: "btn btn-info" %>
<% end %>
<% else %>
<%= form_for(@user) do |f| %>
<%= f.submit "Add Country", class: "btn btn-info" %>
<% end %>
<% end %>
我尝试了一些不同的东西,没有运气,所以我刚刚恢复到基本结构。我目前正在使用form_for,但这是目前为止效果最好的,我并不依赖于该解决方案。
以下是我的控制器,如果需要,我还没有设置Trips控制器,因为我只使用它来加入用户和国家模型(也许我需要设置一个?)。
users_controller.rb
class UsersController < ApplicationController
def index
@users = User.all
end
def show
@user = User.find(params[:id])
@countries = Country.all
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
redirect_to @user
else
render 'new'
end
end
def update
redirect_to user_path
end
private
def user_params
params.require(:user).permit(:username, :email, :password, :password_confirmation)
end
end
countries_controller.rb
class CountriesController < ApplicationController
before_action :require_user, only: [:index, :show]
def index
@countries = Country.all
@sort = CS.countries.sort_by {|key, value| value}
@sort = @sort.first @sort.size - 2
end
def show
@country = Country.find(params[:id])
@user = User.find(session[:user_id])
end
end
答案 0 :(得分:0)
我的建议使用collection_select(如果您想了解更多有关collection_select的信息,请点击链接)在编辑用户时向用户添加国家/地区,以下是帮助的示例代码(使用编辑方法)
user_controller
class UsersController < ApplicationController
def index
@users = User.all
end
def show
@user = User.find(params[:id])
@countries = Country.all
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
redirect_to @user
else
render 'new'
end
end
# ---> here additional code to edit method
def edit
@user = User.find(params[:id])
@countries = Country.all
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
redirect_to user_path
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:username,
:email,
:password,
:password_confirmation,
:country_ids => [])
# country_ids is an array that will save data for countries that user have been to
end
end
现在这是一个有趣的,在 views \ user \ edit.html.erb
<%= form_for @user do |f| %>
<!-- simple -->
<p>Email : </p>
<p><%= f.text_field :email %></p>
<!-- if you using bootstrap -->
<div class="row form-group">
<%= f.label "email", :class => 'control-label col-sm-3' %>
<div class="col-sm-5">
<%= f.text_field :email, :class => 'form-control' %>
</div>
</div>
<!-- other inputs (password / password_confirmation) -->
<%= f.collection_select :country_ids, @countries, :id, :name, {}, { multiple: true, class: 'form-control' } %>
<% end %>