Ruby on rails Rails使用条件访问控制器的多视图

Ruby on rails Rails使用条件访问控制器的多视图,ruby-on-rails,controller,action,Ruby On Rails,Controller,Action,我有一个用户模型,除了标准的帐户信息外,还包括发货信息 我有三种不同的视图可以更新用户信息: 巫师 背景 帐目 我知道我应该使用REST模型,所以我尝试通过更新操作运行所有这些更新。一个问题是,在向导视图中,我需要调用条带API。我在更新控制器中有条带调用。但是现在,当用户试图在设置或帐户视图上更新他们的帐户时,更新控制器正在调用stripeapi,这显然不是我想要的 所以我试图做的是,插入一个条件来检查向导参数(:total_value)是否传入,如果传入,则向Stripe收费。如果不是,

我有一个用户模型,除了标准的帐户信息外,还包括发货信息

我有三种不同的视图可以更新用户信息:

  • 巫师
  • 背景
  • 帐目
我知道我应该使用REST模型,所以我尝试通过更新操作运行所有这些更新。一个问题是,在向导视图中,我需要调用条带API。我在更新控制器中有条带调用。但是现在,当用户试图在设置或帐户视图上更新他们的帐户时,更新控制器正在调用stripeapi,这显然不是我想要的

所以我试图做的是,插入一个条件来检查向导参数(:total_value)是否传入,如果传入,则向Stripe收费。如果不是,则只需更新用户数据。但我还没能让它起作用,它只是更新用户,而不是向Stripe收费

这是分离这些更新的正确方向吗?还是应该在用户控制器中创建自定义操作?这是怎么回事

用户\u控制器

def update
  if !params[:total_value].nil?
    if @user.update_attributes(params[:user])
      # flash[:success] = "Profile updated"
      sign_in @user
      # Value input by the user (in dollars)
      @userPrice = params[:user][:total_value]
      # Send full price in cents to Stripe
      @stripePrice = @userPrice.to_i * 100

      Stripe::Charge.create(
        :amount => @stripePrice,
        :currency => "usd",
        :card => params[:user][:stripe_card_token],
        :description => "Charge for service"
      )  
      redirect_to success_path
      flash[:success] = "Hurray!"
    else
      flash.now[:notice] = "Can not be saved, please enter information."
      render :new
    end
  elsif 
    if @user.update_attributes(params[:user])
      sign_in @user
      flash[:success] = "Profile updated"
      redirect_to account_path
    else
      flash[:error] = "Error"
    end
  end    
 end
向导/show.html.erb

  <%= form_for(@user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
        <%= f.text_field :total_value, placeholder: "0", :class => 'amount' %>

        <%= f.label :name %>
        <%= f.text_field :name, required: "required" %>

        <%= f.label :address_1, "Address" %>
        <%= f.text_field :address_1, required: "required" %>

        <%= f.label :address_2, "Address line 2" %>
        <%= f.text_field :address_2 %>

        <%= f.label :city, "City" %>
        <%= f.text_field :city, required: "required" %>

        <%= f.label :state, "State" %>
        <%= f.text_field :state, required: "required" %>

        <%= f.label :zip, "Zip code" %>
        <%= f.text_field :zip, required: "required" %>

        <%= f.hidden_field :stripe_card_token %>

        <%= label_tag :card_number, "Credit Card Number " %>  
        <%= text_field_tag :card_number, nil, name: nil %>  

        <%= label_tag :card_code, "Security Code on Card (CVV)" %>  
        <%= text_field_tag :card_code, nil, name: nil %>  
       <%= label_tag :card_month, "Card Expiration" %>  
        <%= select_month nil, {add_month_numbers_true: true}, {name: nil, id: "card_month"}%>  
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"}%>  
        <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>

    <% end %>
      <%= form_for(@user) do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
            <%= f.label :name %>
            <%= f.text_field :name %>

            <%= f.label :address_1, "Address" %>
            <%= f.text_field :address_1 %>

            <%= f.label :address_2, "Address line 2" %>
            <%= f.text_field :address_2 %>

            <%= f.label :city, "City" %>
            <%= f.text_field :city %>

            <%= f.label :state, "State" %>
            <%= f.text_field :state %>

            <%= f.label :zip, "Zip code" %>
            <%= f.text_field :zip %>  

            <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>
      <% end %>
  <%= form_for(@user) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :email %>
        <%= f.text_field :email %>

        <%= f.label :password %>
        <%= f.password_field :password %>

        <%= f.label :password_confirmation, "Confirm Password" %>
        <%= f.password_field :password_confirmation %>

        <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>

  <% end %>

'金额'%>
users/shipping.html.erb

  <%= form_for(@user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
        <%= f.text_field :total_value, placeholder: "0", :class => 'amount' %>

        <%= f.label :name %>
        <%= f.text_field :name, required: "required" %>

        <%= f.label :address_1, "Address" %>
        <%= f.text_field :address_1, required: "required" %>

        <%= f.label :address_2, "Address line 2" %>
        <%= f.text_field :address_2 %>

        <%= f.label :city, "City" %>
        <%= f.text_field :city, required: "required" %>

        <%= f.label :state, "State" %>
        <%= f.text_field :state, required: "required" %>

        <%= f.label :zip, "Zip code" %>
        <%= f.text_field :zip, required: "required" %>

        <%= f.hidden_field :stripe_card_token %>

        <%= label_tag :card_number, "Credit Card Number " %>  
        <%= text_field_tag :card_number, nil, name: nil %>  

        <%= label_tag :card_code, "Security Code on Card (CVV)" %>  
        <%= text_field_tag :card_code, nil, name: nil %>  
       <%= label_tag :card_month, "Card Expiration" %>  
        <%= select_month nil, {add_month_numbers_true: true}, {name: nil, id: "card_month"}%>  
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"}%>  
        <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>

    <% end %>
      <%= form_for(@user) do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
            <%= f.label :name %>
            <%= f.text_field :name %>

            <%= f.label :address_1, "Address" %>
            <%= f.text_field :address_1 %>

            <%= f.label :address_2, "Address line 2" %>
            <%= f.text_field :address_2 %>

            <%= f.label :city, "City" %>
            <%= f.text_field :city %>

            <%= f.label :state, "State" %>
            <%= f.text_field :state %>

            <%= f.label :zip, "Zip code" %>
            <%= f.text_field :zip %>  

            <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>
      <% end %>
  <%= form_for(@user) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :email %>
        <%= f.text_field :email %>

        <%= f.label :password %>
        <%= f.password_field :password %>

        <%= f.label :password_confirmation, "Confirm Password" %>
        <%= f.password_field :password_confirmation %>

        <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>

  <% end %>

users/account.html.erb

  <%= form_for(@user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
        <%= f.text_field :total_value, placeholder: "0", :class => 'amount' %>

        <%= f.label :name %>
        <%= f.text_field :name, required: "required" %>

        <%= f.label :address_1, "Address" %>
        <%= f.text_field :address_1, required: "required" %>

        <%= f.label :address_2, "Address line 2" %>
        <%= f.text_field :address_2 %>

        <%= f.label :city, "City" %>
        <%= f.text_field :city, required: "required" %>

        <%= f.label :state, "State" %>
        <%= f.text_field :state, required: "required" %>

        <%= f.label :zip, "Zip code" %>
        <%= f.text_field :zip, required: "required" %>

        <%= f.hidden_field :stripe_card_token %>

        <%= label_tag :card_number, "Credit Card Number " %>  
        <%= text_field_tag :card_number, nil, name: nil %>  

        <%= label_tag :card_code, "Security Code on Card (CVV)" %>  
        <%= text_field_tag :card_code, nil, name: nil %>  
       <%= label_tag :card_month, "Card Expiration" %>  
        <%= select_month nil, {add_month_numbers_true: true}, {name: nil, id: "card_month"}%>  
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"}%>  
        <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>

    <% end %>
      <%= form_for(@user) do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
            <%= f.label :name %>
            <%= f.text_field :name %>

            <%= f.label :address_1, "Address" %>
            <%= f.text_field :address_1 %>

            <%= f.label :address_2, "Address line 2" %>
            <%= f.text_field :address_2 %>

            <%= f.label :city, "City" %>
            <%= f.text_field :city %>

            <%= f.label :state, "State" %>
            <%= f.text_field :state %>

            <%= f.label :zip, "Zip code" %>
            <%= f.text_field :zip %>  

            <%= f.submit "Update your shipping information", class: "btn btn-large btn-primary" %>
      <% end %>
  <%= form_for(@user) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :email %>
        <%= f.text_field :email %>

        <%= f.label :password %>
        <%= f.password_field :password %>

        <%= f.label :password_confirmation, "Confirm Password" %>
        <%= f.password_field :password_confirmation %>

        <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>

  <% end %>

我发现两个问题。首先是你的:

if!参数[:总值].nil?

应该是

除非参数[:user][:total_value].nil?
(我个人更喜欢
除非
而不是
如果!…


如Nishant在评论中所述。其次,您有一个
elsif
,并且该条件结束,而不检查任何内容。只需一个
就足够了。

在控制器中,您正在检查是否
!参数[:总值].nil?
。但它不应该是
!参数[:用户][:总值].nil?
Yep。成功了!非常感谢!我想我误解了参数的工作原理。(我是新手)你能告诉我哪里可以学到更多吗?