RoR:点击按钮时保持数据

时间:2014-05-11 01:17:11

标签: ruby-on-rails

我坚持使用按钮点击的持久数据。是否可以从其他页面获取不同控制器功能的参数。

控制器

def create
  @login=Login.new
  @login.name=params[:name]
  @login.email=params[:email]
  @login.password=params[:password]
  @login.phone_number=params[:phone_number]

  if @login.save
        render :action => 'success'
  else
   puts (@login.errors.full_messages)
       render :action => 'failure'
  end

end

def operation
if params[:commit] == "Clicked"
    puts ("Inside CLICKED")
    redirect_to action: 'clicked'
else
    redirect_to action: 'create'
end
end

view(create.html.erb)

 <h1>Welcome to DemoSite.com</h1>
 <p></p>

 <%= form_for (@login), :url => {:action => "create"} do |f| %>
 <p>
   <%= f.label :Name %><br>
   <%= f.text_field :name %>
 </p>

 <p>
  <%= f.label :Email %><br>
  <%= f.text_field :email %>
 </p>

 <p>
  <%= f.label :Phone_Number %><br>
  <%= f.telephone_field :phone_number %>
 </p>

 <p>
  <%= f.label :Password %><br>
  <%= f.password_field :password %>
 </p>

 <p>
  <%= f.label :password_confirmation %><br>
  <%= f.password_field :password_confirmation %>
 </p>

 <p>
  <%= f.submit('Submit') %>
 </p> 
<% end %>

index.html.erb

<h1>Welcome to DemoSite.com</h1>
<p></p>

<%= form_tag "/logins/operation", :method => "post"  do %>
<p>
  <%= label_tag(:username, "Username") %><br>
  <%= text_field_tag(:username) %>
</p>
<p>
  <%= label_tag(:password, "Password") %><br>
  <%= password_field_tag(:password) %>
</p>

<p>
 <%=submit_tag "Create" %> 
 <%= submit_tag "Clicked" %> 
</p>

当我运行此功能时,当我点击创建按钮时,它会直接从index.html.erb指示我 failure.html.erb ,而不会点击 create.html.erb 。另外,如何在点击按钮后将数据保存在create方法中?

1 个答案:

答案 0 :(得分:0)

您的operation操作重定向到create,而您的create操作会导致失败或成功,您的创建操作永远不会执行默认操作(即渲染您的创建视图)。

大多数时候new操作会呈现表单,而create操作(应该是POST)实际上会创建(保存)数据。

现在执行的重定向永远不会成功,因为它不会接收任何数据,因此它始终无法创建用户,因此它将始终显示失败屏幕。

[更新]最简单(但仍然很脏)修复它:

如果您重定向到create操作,则是GET请求,而不是POST。

所以最简单的解决方法就是:

def create
  if request.post?
    @login = Login.new(params)

    if @login.save
      render :action => 'success'
    else
      puts (@login.errors.full_messages)
      render :action => 'failure'
    end
  else
    @login = Login.new
  end
end

因此,如果它是POST:尝试保存并检查错误。如果是GET,则只渲染create.html.erb

最好,干净的REST方式是从new操作重定向到operation操作,您的表单将POST到create操作。这就是它应该如何。