Rails 3 - 表单,自定义提交按钮基于动作?

时间:2011-08-11 19:18:02

标签: ruby-on-rails ruby-on-rails-3

我目前有几种表单,如果我正在编辑或新操作,我正在尝试更改提交它的按钮。我创建了两个表单但是这个表面很糟糕,我现在只使用单个表单部分。

在我的部分结束时,我的表格末尾有这样的东西:

<p>
  <% if controller.action_name == 'new' %>
  <%= f.submit "Create", :class => "pink_button"%> or
  <% elsif controller.action_name == 'edit' %>
  <%= f.submit "Update", :class => "pink_button"%> or
  <% end %>
  <%= link_to "cancel", :back %>
  </p>  

这样,如果我创建一些新的,按钮显示“Create”,如果它是用户试图完成的更新,则按钮显示“Update”。这很有效,直到表单提交并且验证失败。

在我的控制器中,我正在捕捉失败的东西:

def update
    @list = current_user.lists.find(params[:id])    

    if @list.update_attributes(params[:list])
      redirect_to list_path(@list), :notice => "List '#{@list.name}' updated."
    else
      render :action => 'edit'
    end
  end

因此简单地重新呈现表单。问题是,我不再在编辑路径上了。这意味着,我的表单按钮不会再出现了。

我正在尝试做什么约定?

由于

3 个答案:

答案 0 :(得分:15)

是的,默认情况下,这是在Rails中使用i18n处理的。翻译在ActionView中,如下所示:

en:
  helpers:
    select:
      # Default value for :prompt => true in FormOptionsHelper
      prompt: "Please select"

    # Default translation keys for submit FormHelper
    submit:
      create: 'Create %{model}'
      update: 'Update %{model}'
      submit: 'Save %{model}'

您需要做的只是f.submit(不通过“创建”或“编辑”等),翻译将完成其余的工作。您可以通过将上面的yaml放入本地语言环境来覆盖这些内容。

如果您需要设置课程,则可以传递nil,例如f.submit nil, :class => 'whatev'

答案 1 :(得分:13)

Rails的方法是检查记录是否是新记录:

@list.new_record? ? "Create" : "Update" 

答案 2 :(得分:0)

Rails有一个方法persisted?来确定对象是否已持久化。

如果您正在使用erb,请执行

<%= f.submit (@list.persisted? ? 'Create' : 'Update) %>

如果你正在使用haml,请使用

= f.submit (@list.persisted? ? 'Create' : 'Update')

有关详情,请参阅http://apidock.com/rails/ActiveRecord/Persistence/persisted%3F