我正在尝试将select_tag中的输入插入到我的控制器方法中。 我看起来似乎无法解决这个问题。
这是我下面的代码,根本没有任何关于等级选择的内容。
<h1>hello please set <%= @user.username %>'s rank'</h1>
<%= select_tag 'rank', options_for_select(@ranks.collect{ |r| [r.rank_name] }) %>
<%= button_to "Update", :action => "set_user_rank_update", value: "#{@user.id}", method: :post %>
使用控制器和路线更新以下内容
控制器:
class Admin::RankController < ApplicationController
before_action :admin?
def new
@rank = Rank.new
end
def create
@rank = Rank.new(rank_params)
if params["rank"]["admin"].to_i == 1
@rank.toggle! :admin?
end
if @rank.save
flash[:success] = "Rank created"
redirect_to root_path
else
flash[:danger] = "Failed to create rank"
render 'new'
end
end
def set_user_rank_new
@user = User.find_by_id(params["format"])
@ranks = Rank.all
end
def set_user_rank_update
@user = User.find_by_id(params["value"])
@rank = Rank.find_by_id(params["rank"])
@rank_backup = @user.rank.first
debugger
@user.rank - @user.rank.first
@user.rank << @rank
if @user.rank.first == @rank
flash[:success] = "Set user's rank"
redirect_to root_path
else
flash[:danger] = "Failed to set user's rank"
@user.rank - @user.rank.first
@user.rank << @rank_backup
render 'set_user_rank_new'
end
end
private
def rank_params
params.require(:rank).permit(:rank_name, :rank_color)
end
end
路线
Rails.application.routes.draw do
devise_for :users,
:controllers => { :registrations => "member/registrations" , :sessions => "member/sessions"}
scope module: 'public' do
root 'welcome#index'
end
scope module: 'member' do
get 'members/:id' => 'member#show'
end
scope module: 'admin' do
get 'rank/new' => 'rank#new'
post 'rank/create' => 'rank#create'
get 'rank/set_user_rank/new' => 'rank#set_user_rank_new'
post 'rank/set_user_rank/update' => 'rank#set_user_rank_update'
end
end
答案 0 :(得分:1)
尝试将2个元素数组传递给options_for_select。你拥有它的方式看起来会得到你的选项文本而没有值,这可以解释为什么它不会出现在参数中。
所以例如:
<%= select_tag 'rank', options_for_select(@ranks.collect{ |r|[r.rank_name, r.id] }) %>
答案 1 :(得分:1)
button_to
帮助器创建一个内联表单,其中只包含辅助语句中包含的参数(在本例中为用户标识)。
您可以通过检查页面上生成的HTML来检查这一点 - 我认为这将显示位于表单标记之外的排名的输入字段。
要包含rank参数,您应该使用表单助手设置表单,并确保排名输入包含在表单中。
答案 2 :(得分:0)
您在控制器操作中需要它的目的是什么? 使用link_to,您也可以转发params。 看到你的控制器和你的路线会非常有帮助。