【问题标题】:Rails 3, update data using selection from select tagRails 3,使用选择标签中的选择更新数据
【发布时间】:2011-05-22 17:34:12
【问题描述】:

我对 Rails 很陌生,但对 Spring 和 .net 等“常规”MVC 编程非常熟悉。我正在尝试应对所有这些新的做事方式,但我一直卡住 - 特别是在根据用户所做的选择使用不同数据渲染/刷新相同视图时。

这一切都非常简单,我可以看到它已经被问了很多次了 - 虽然,我似乎找不到任何明确的“这是这样做的 Rails 方式”的答案。

我想做的就是这样:

数据库“方案”,包含表 a、b、c 及其引用:
C -> A
C -> B

基于在下拉列表中选择的 B,我想显示所有“A 的 Cs”——不要介意查询部分,这是直截了当的。 到目前为止,我选择第一个 B 作为控制器中页面的“首次渲染”,但是当用户在下拉列表中选择另一个 B 时,应根据选择重新渲染视图...
我不想使用自定义 javascript 填充或其他一些“奇怪”的方式。我必须可以根据 RoR 中的选择选择某些内容并刷新视图。

我希望您能帮助我或为我指明正确的方向。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model-view-controller


    【解决方案1】:

    将所有这些选择列表放在一个表单中,并在列表的“onchange”事件中添加提交表单的 javascript ($('form_name').submit())。提交表单后,您会将所有选定的值作为参数(params[:select_list_1]、params[:select_list_2])。根据需要处理它们,触发查询并再次显示视图。

    您可以将表单提交给相同的操作。动作是这样的:

    def index
      if !request.post?
        # Generate default values
      else
        # Generate new resultset based on params
      end
    end
    

    编辑(表单示例):表单可以添加为 :url 指定表单元素的操作:

    <%= form_for(:select_list_form, :url => {:controller => "my_controller", :action => "index"}) do |f| %>
    <!-- Your select list here -->
        <%= f.submit "Continue", :class => "form-button form-left" %>
    <% end %>
    <!-- Render data based on your instance variables -->
    

    【讨论】:

    • 当然不是! - 只是还没有让它工作:P 你能显示更多的代码吗?我可以让表单正确提交。如果我提交它,它会抱怨我没有创建方法 - 我知道它的标准 crud,但我不需要在这里创建任何东西......我在 form_tag 动作中有一个选择标签 = > 我的行动。
    • 顺便说一下,它只有一个选择框,根据选择更新数据表:)
    • 所以,我让它工作了!但是,表单提交总是试图调用创建操作真的是真的吗?如何避免这种情况...??
    • 没有。表单调用您指定的操作。看看编辑。我正在添加一个通用表格。如果您要向模型添加表单,则可以对其进行改进。完整的参考可以在这里找到:api.rubyonrails.org/classes/ActionView/Helpers/…
    • 好吧,我认为我们现在更接近了 - 但是,我尝试过,并迷失在执行此操作所需的视图中。因为我只想重新显示当前视图。像这样:用户获取 index.erb.html,调用 index 操作。这会根据“默认”值填充集合。用户在下拉列表中更改了某些内容,“默认”值被选定的值覆盖,从数据库中获取数据(存储在与索引操作中使用的相同的实例变量中)再次使用新数据呈现相同的视图。指定一个动作需要该名称的视图?
    【解决方案2】:

    我自己也遇到过这个问题,我发现最干净的方法是使用这个:

    It call an ajax request when the select list change.然后你必须在你的控制器中设置一个新的动作,例如 load_related :

    def load_related
        @childreen = Model.where(....)
        render :update do |page|
             page.replace 'div id where you whant stuff to appear', :partial => '...'
        end
    end
    

    这是您在 Rails 中的第一个 ajax 请求。对于文档:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多