【问题标题】:Rails form select "selected" parameter not working for email optionsRails 表单选择“选定”参数不适用于电子邮件选项
【发布时间】:2017-10-25 21:51:57
【问题描述】:

我在搜索表单中有一系列选择框,在提交表单并加载结果时,我需要保留这些选择框。我正在使用模板化表单选择,它在表单提交后(通过 POST)正确选择了 4 个输入中的 3 个。用于选择电子邮件的输入无法正常工作 - 奇怪的是,它仅适用于某些选项。

由于选择框是模板化的,我认为它一定与内容相关。或者我只是忽略了一些非常简单的事情......

随机或非随机事实:目前有四个电子邮件地址填充选择选项。两个在选择和提交时不会重新加载,它们“恰好”是我不只是编造的电子邮件,我已经在 Firefox 56 中为它们存储了登录信息。但是,我在 Chrome 上尝试过,同样的两封电子邮件没有也不要在那里预先选择。其中只有一个是 Chrome 中保存的登录信息。

我被难住了。

我在 Rails 5.1.4 上,使用 Ransack 1.8.3 和 Simpleform 3.5.0。选择框使用 Selectize 0.12.4 美化。

控制器

class Admin::StoriesController < ApplicationController

layout "admin"
before_action :set_search_variables

def index
    @stories = @q.result.page params[:page]
end

def search
    index
    render :index
end

...

private

def story_params
    allowed = [
        :name,
        :story,
        :email,
        :organization,
        :image,
        :published,
        :user_profession,
        :reviewed,
        :image_delete
    ]
    params.require(:story).permit(allowed)
end

def set_search_variables
    @q = Story.order(created_at: :desc).ransack(params[:q])
    @options = Story.select([:name, :organization, :email, :user_profession])
end
...

结束

搜索表单

<%= search_form_for [:admin, @q], url: search_admin_stories_path, html: { method: :post }, class: "pt-4 mod-search-form" do |f| %>

...

<%= render partial: 'admin/_forms/select', locals: { label: "Name", search_param: :name_eq, attribute: :name, f: f } %>

<%= render partial: 'admin/_forms/select', locals: { label: "Email", search_param: :email_eq, attribute: :email, f: f } %>

<%= render partial: 'admin/_forms/select', locals: { label: "Organization", search_param: :organization_eq, attribute: :organization, f: f } %>

<%= render partial: 'admin/_forms/select', locals: { label: "Profession", search_param: :user_profession_eq, attribute: :user_profession, f: f } %>

...

<%= f.submit "Search", class: "btn btn-outline-primary btn-block my-4 w-75 mx-auto" %>
<%= f.button "Reset", type: :button, id: :search_reset, class: "btn btn-sm btn-outline-secondary w-50 mx-auto mb-4 d-block" %>

选择部分

<div class="form-group">
<%= f.label search_param, label %>
<%= f.select search_param,
    options_from_collection_for_select(@options.order(attribute),
    attribute,
    attribute,
    request.method.eql?("POST") ? params[:q][search_param] : ""),
    {include_blank: "Any"},
    "data-placeholder": "Any",
    class: "form-control"
%>
</div>

和 Selectize js

$('select').selectize({
    selectOnTab: true,
    allowEmptyOption: true
});

【问题讨论】:

  • 您的模型上是否将:search_param 设置为attr_accessor
  • 我不明白为什么这是必要的,或者为什么当所有其他人都没有被标记为 w/attr_accessor 时它会为所有其他人工作;然而,我还是尝试了——没有运气。

标签: ruby-on-rails forms simple-form ransack


【解决方案1】:

设法弄清楚这一点。问题是 options_from_collection_for_select 的“selected”参数找到了多个具有相同值的选项。正如您在上面的示例中看到的那样,我将属性名称用作 valuetext 方法。

对于在数据库中只出现一次的任何选项,在提交后,选择框会加载正确的“选定”选项。但是,例如,电子邮件,例如admin@example.com,用于多个故事,然后选择的选项变得模棱两可,它什么也没选择。

我的解决方案是使用不同的、更通用的方法 (options_for_select) 创建选项,确保选项数组唯一

新选择部分

<div class="form-group">
<%= f.label search_param, label %>
<%= f.select search_param,
    options_for_select(prepare_select_options_for(@options, attribute),
    request.method.eql?("POST") ? [params[:q][search_param]] : ""),
    {include_blank: "Any"},
    "data-placeholder": "Any",
    class: "form-control"
%>
</div>

辅助方法

def prepare_select_options_for(collection, attr)
    attr = attr.to_sym
    collection.
        order(attr).
        map(&attr).
        reject(&:blank?).
        uniq
end

现在就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2016-05-15
    • 2017-10-09
    • 2012-09-23
    相关资源
    最近更新 更多