创建一个select表单以在数据库表中设置一个布尔值

时间:2014-01-18 11:35:51

标签: ruby-on-rails

所以我在我的书籍视图中有这个表格,它显示了一个选择框,可以选择布尔值是真还是假。

但是当我提交它时,如果我选择它,它不会将布尔值更改为true。

这是我的书籍计划基本上:

create_table "books", force: true do |t|
    t.string   "name"
    t.integer  "user_id"
    t.boolean  "oppetool",   default: false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "count",      default: 0
  end

为什么不改变我的条目的布尔值?

我的观点:

<% provide(:title, "Submit a book") %>

<b align="center">Enter the name of a book you want to add into the database and then press 'Submit!'</b>
    <%= form_for(@book) do |f| %>
            <div class="forms">
                        <%= f.text_field :name, placeholder: "Type what you want to say...", autofocus: true %>

                        <%= f.check_box(:oppetool, {}, "True", "False") %>
                        <%= f.submit 'Submit!' %>
                </div>
        <% end %>

图书管理员:

class BooksController < ApplicationController

  before_action :signed_in_user, only: [:index,:edit,:update, :destroy]
  before_action :admin_user,     only: :destroy
  before_action :set_book, only: [:show, :edit, :update, :destroy]

  def index
    @books = Book.all
  end

  def show
     @book = Book.find(params[:id])
  end

  def new
     @book = current_user.books.build
  end

  def create
    @book = current_user.books.build(book_params)
    if @book.save
      flash[:success] = "Book listed!"
      redirect_to books_path
    else
      flash[:success] = "Did you leave a field empty? All fields must be filled before we can accept the review!"
      render new_book_path
    end
  end

  def edit

  end

  def update

  end

  def destroy

  end
  # Private section
  private
  def book_params
    params.require(:book).permit(:name, :user_id)
  end

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end

  def admin_user
    redirect_to(root_url) unless current_user.admin?
  end
  # Redirecting not logged in user etc.
  def signed_in_user
    unless signed_in?
      store_location
      redirect_to '/sessions/new', notice: "Please sign in!"
    end

  end

end

3 个答案:

答案 0 :(得分:1)

阻止值改变的是控制器逻辑中的这一行:

params.require(:book).permit(:name, :user_id)

您实际上阻止:oppetool在此处更改。将此行更改为

params.require(:book).permit(:name, :oppetool)

我还会在此处移除:user_id以避免人mass-assigning这个值,这可能是您想要的。


顺便说一下,为什么要自己设置两个复选框值,而不是将它们留空,如下所示:

<%= f.check_box(:oppetool) %>

如果你使用它,Rails应该自动将默认值“0”和“1”转换为相应的布尔值。我不确定这是否适用于“真实”和“假”,这就是我要问的原因。

答案 1 :(得分:1)

您未在允许的参数列表中包含:oppetools(book_params)。

答案 2 :(得分:1)

首先,更新book_params以允许oppetool

params.require(:book).permit :name, :user_id, :oppetool

然后只需使用

<%= f.check_box :oppetool %>

默认设置使用“0”表示false,“1”表示true。