我该如何处理这个Rails用例?

时间:2011-09-14 17:34:10

标签: ruby-on-rails

我有一个Exercise模型,它有这些列(伪Ruby):

model Exercise do
  string :name
  calories_burned :float
end

我希望当用户添加练习时能够以这种方式进行练习:

  • 如果以前的练习存在
    • 显示名称为已添加
    • 的选择元素
    • 显示一个复选框,允许添加新的,切换输入 字段到文本域
  • 否则
    • 显示文字字段

问题是,我不知道如何把它放在我看来。以下是处理else案例的方法:

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>

我现在有这样的事情:

  <div class="field">
    <% if @exercise_added %>
        <div id="select_div">
            <%= select_tag :name,options_for_select(@exercise_added) %>
            <input type="checkbox" name="custom_type_checked" id="which_type">New type?</input>
        </div>
    <% end %>
    <div id="regular_field">
        <%= f.label :name %><br />
        <%= f.text_field :name %>
    </div>
  </div>

@exercise_added中,我列出了数据库中所有练习的名称。什么是最好/最干净的处理方法?

编辑:现在,我有一个textfield和一个select,并且通过使用Javascript,我正在更改元素的名称(并隐藏另一个元素)。到目前为止,它正在发挥作用,但如果存在其他方法,我仍然会感兴趣。

4 个答案:

答案 0 :(得分:4)

您可以检查数组@exercise_added是否为空,并相应地显示选择字段或文本字段。

      <div class="field">
        <% if !@exercise_added.empty? %>
            <div id="select_div">
                <%= select_tag :name,options_for_select(@exercise_added) %>
                <input type="checkbox" name="custom_type_checked" id="which_type">New type?</input>
            </div>
        <% else %>
        <div id="regular_field">
            <%= f.label :name %><br />
            <%= f.text_field :name %>
        </div>
        <%end%>
      </div>

答案 1 :(得分:0)

您应该仔细查看 this railscast (以及following part)。祝你好运!

答案 2 :(得分:0)

默认情况下,我会显示选择框和按钮,文本框隐藏,除非变量@show_textbox为真。像这样:

<div class="field">
    <div id="select_div">
        <%= select_tag :name,options_for_select(@exercise_added) %>
        <%= f.submit "New Exercise" %>
    </div>
    <div id="regular_field" <%= hidden_unless @show_textbox %> >
        <%= f.label :name %><br />
        <%= f.text_field :name %>
    </div>
</div>

我写了一个辅助函数

def hidden_unless cond
  raw "style=\"display: none;\"" unless cond
end

# this one is helpful, too
def hidden_if cond
  raw "style=\"display: none;\"" if cond
end

然后,在我的控制器中,检查是否按下了“新练习”按钮。如果是这样,基本上将@show_textbox设置为true,然后重新呈现new表单。

def create
  # .....

  # did we get here because the user pressed "New Exercise"?
  if params[:commit].eql?("New Exercise")
    @show_textbox = true
    # probably some other code to replicate what happens in your #new action
    render :action => new
  end

  # ....
end

如果:name字段中包含任何文字,您可以检入控制器,并使用该字段覆盖选择框。

这应该没有javascript工作。我添加了一些jQuery来替换带有链接或复选框的按钮,其中单击处理程序连接到显示文本框的函数,即$('#regular_field').toggle();

我没有处理隐藏选择框的问题。我实际上认为留下那个可能更好。无论如何,您可以使用类似的方法隐藏它。

答案 3 :(得分:0)

如果您使用两种表格怎么办?练习在@exercise_added时处理案例的一种形式,以及处理新练习创建的第二种形式。它甚至可以归结为POST和PUT之间的差异,具体取决于从下拉列表提交练习后您正在做什么。

我很想看到更多的代码以及控制器,因为看起来这个表单可能是嵌套的?