如何将select_tag的输入传递给rails控制器

时间:2017-02-01 17:23:41

标签: ruby-on-rails

我正在尝试将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

3 个答案:

答案 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。 看到你的控制器和你的路线会非常有帮助。