是否可以将数组中表单提交的字符串与模型数据库中的字符串值进行比较?

时间:2015-05-01 06:15:29

标签: ruby-on-rails arrays sqlite model-view-controller

这更多地涉及轨道理论。我想比较用户提交的字符串与填充模型中的字符串。这可能吗?即使有可能在推出的模型中创建用户并比较那里的字符串会更好吗?

是否有关于如何实现此目的的文档

我的名字有点不稳定,我从微博教程中调整了这个以尝试成为dna(用户输入) - > rna(mrna db)音序器(我明白这是非常糟糕的形式)

用户/ new.html.erb(渲染)/ _ form.hrml.erb

<%= form_for :user do |t| %>
  <%= t.fields_for 'inputdna[]', [] do |p| %>
     dna <%= p.text_field :dna %>
  <% end %>
  <%= t.submit "Submit" %>
  <% end %>

用户模型

class User < ActiveRecord::Base

    dna_options = 'ttt, ttc, tta'.split(',')

    #validates :dna_options, presence: true

    # returns true|false
    def dna_valid?(user_input)
        user.input.each
           return false if unless dna_options.include? user_input
    end
    return true
 end

控制器/ users_controller.rb

class UsersController < ApplicationController

    # GET /users
    # GET /users.json
    def index
         @users = User.new # not touched, however the convention would normally be User.new
    end

    def new 
         User.create(full: params['user']['full'], dna: params['user']['inputdna']['dna'], mrna: params['user']['mrna']) if User.dna_valid? params['user']['inputdna']['dna']
    end
 end

用户模型的seed.rb

User.create(full: "phenylalanine", dna: "ttt", mrna: "uuu")
User.create(full: "phenylalanine", dna: "ttc", mrna: 'uuc')
User.create(full: "leucine", dna: 'tta', mrna: 'uua')

2 个答案:

答案 0 :(得分:1)

可以比较字符串,很少有方法可以做到这一点,以及围绕用户输入的难度可能是一个挑战。

假设你有一个如下的模型:

Class SomeStrings
    @@some_string = 'String Answer'
end

您可以将其与某些参数的用户输入进行比较,如下所示:

params['user_input'] == SomeStrings.some_string

这将返回一个布尔值(true | false),用于if / case语句。

现在,为了确保输入匹配而不管情况如何,您有两个简单的选项:

params['user_input'].downcase == SomeStrings.some_string.downcase 

params['user_input'].casecmp(SomeStrings.some_string)

http://ruby-doc.org/core-1.9.3/String.html#method-i-casecmp

使用casecmp的后一种方法比下两个字符串部分快得多。

现在在这个例子中我使用了一个类变量@@ some_string,但是你可以使用返回字符串的变量/方法将相同的逻辑应用于任何模型。此模型可以是活动记录,或其他ORM记录,或只是一个类。

如果你想再输入那就喊。

&LT;&GT;

如果您希望逐个用户地预先填充此模型,则需要创建一定程度的持久性。这可能是您的代码“硬编码”,数据库或会话。例如,如果要将某些用户输入与会话中存储的5个单词列表中的一个进行比较,则可以执行以下操作:

session['words_to_compare_to'] = Words.generate_five_random_words unless session['words_to_compare_to']

您可以在模型上创建一个创建单词的方法,这会将它们分配到会话中。这意味着每个用户都会得到一些单词来比较,每个用户是随机的。这可能是你的方法:

class Words
  @@words_list = 'help, go, north, fred, mimi, the, and, elf'.split(",")

  def generate_five_random_words
     words_to_return = []    
     5.times{ words_to_return << @@words_list.sample }
     return words_to_return
  end
end

然后比较你收到的输入,看看它是否在控制器的5个随机字内,你可以这样做:

session['words_to_compare_to'].include? params['user_input'].downcase

我们在这里使用downcase,因为我们所有的单词列表都是小写的。如果在5个单词的数组中找到用户输入,则返回布尔值true | false。我希望这能提供一些你可以重用的东西。

*更新以下代码添加至问题*

我将假设用户填写文本字段并将其提交给route / user / create。我假设目的是检查用户提交的3个字母dna是否在可接受的dna列表中。

首先,让我们将可接受的dna组合添加到用户模型中:

Class User
  dna_options = 'ttt, ttc, tta'.split(',')

   # returns true|false
  def self.dna_valid?(user_input)
     dna_options.include? user_input
  end
end

现在,根据您使用的ORM,您还可以使用验证器:http://guides.rubyonrails.org/active_record_validations.html

要在控制器中使用上述内容,您可以执行以下操作:

class UsersController < ApplicationController

   def index
      @users = Array.new # not touched, however the convention would normally be User.new
   end

   def create 
      User.create(full: params['user']['full'], dna: params['user']['inputdna']['dna'], mrna: params['user']['mrna']) if User.dna_valid? params['user']['inputdna']['dna']
   end
end

现在,我在这里做了很多假设,因为你的代码缺少与模型相同的实体,但是我希望你能看到可以做些什么。如果params ['user'] ['inputdna']返回一个数组,您可以将代码更改为:

if user.dna_valid? params['user']['inputdna']

并将模型中的布尔运算符更改为:

   # returns true|false
   # expects user_input to be an array
  def self.dna_valid?(user_input)
     user.input.each do |dna|
        return false if unless dna_options.include? dna
     end
     return true
  end

如果在dna_options中找到所有实体,则返回true;如果其中一个实体未找到,则返回false

答案 1 :(得分:0)

如果您只想比较和找到完全匹配,那么这就是我使用的。

    all_users = params[:user][:dna].map do |u|
        User.find_by(name: u)
    end

在这里,您将从“params [:user]”中获取表单提交的响应,然后使用“User.find_by(name:u)”将该响应与User表进行比较,并将匹配项分配给“all_users”通过地图循环。

这里可能遇到的问题是表单提交是否在模型中找不到条目,​​然后返回“nil”。这个简单的逻辑不处理“nil”返回。