簡體   English   中英

Ruby on Rails-表單未從哈希中填充-僅在heroku中,在本地/開發環境下工作正常

[英]Ruby on Rails - Form not populating from hash - Only in heroku, works fine on local/dev environment

繼續我的傳奇故事,創建一個稱為地址的多態對象,該對象與客戶和聯系人(以及將來的其他對象)具有一對多關系。

Ruby多態關聯在本地工作,但不在heroku中工作

顯示帳戶視圖應將參數發送到帶有多態數據(addressable_id,addressable_type)的new_address,在這種情況下,此數據為account_id和帳戶控制器。

顯示帳戶具有以下鏈接以創建新地址:

<%= link_to new_address_path(:controller => "addresses", :action => "new", :addressable_type => :account, :addressable_id => @accounts.id, ) do %>
<%= (image_tag("address_new.png", :width => "70%")) %>
<br /> New Address
<% end %>

轉發后,URL顯示:

http://vulcanosys.herokuapp.com/addresses/new?addressable_id=1&addressable_type=accounts

表單字段是隱藏的,因此首先我認為這是create操作中的問題,但是在將字段設置為可見后,我可以看到問題是heroku沒有使用哈希上的參數填充表單。

在本地主機中,它可以完美加載,並且URL也顯示:

    http://localhost:3000/addresses/new?addressable_id=1&addressable_type=accounts

地址/ new.html.erb如下

    <div id="central">
<div id="limiter">
    <h1><%= (image_tag("address_new.png", :width => "20%", :align =>"middle")) %> New Address</h1>
    <h4>Please insert Account data:</h4>
    <%= form_for @addresses, url: {action: "create"} do |f| %>
<table class="tshow" align="left" style="width:100%;">
    <col width="50%">
    <col width="50%">
        <%= f.text_field :addressable_type %>
        <%= f.text_field :addressable_id %>
<tr class="even">
        <td><%= f.label :no, "No:" %>*</td>
        <td><%= f.text_field :no %></td>
    </tr>
        <tr class="odd">
        <td><%= f.label :street, "Street:" %>*</td>
        <td><%= f.text_field :street %></td>
    </tr>
    <tr class="even">
        <td><%= f.label :suburb, "Suburb" %>*</td>
        <td><%= f.text_field :suburb %></td>
    </tr>
            <tr class="odd">
        <td><%= f.label :code, "Zip:" %>*</td>
        <td><%= f.text_field :code %></td>
    </tr>
    </table>
</div>
<div id="menu">
<ul class="menu">
    <!-- Access Check - Create New Account -->
    <% if Accessrule.find_by(role_id: current_user.role_id, workspace:2).try(:canwrite?) %>
    <li><%= f.submit " ", :type => :image, :src => image_path("address_save.png"), :width =>"60%" %>
    <br /> <%= f.submit "Save Address", class: "savetext" %><% end %></li>
    <% end %>
    <!-- back Accounts -->
    <li> <%= link_to :back do  %>
    <%= (image_tag("address_back.png", :width => "60%")) %>
    <br /> Back
    <% end %> 
    </li>
    </li>
    </ul>
</div>
</div>

addresss_controller

class AddressesController < ApplicationController
    before_action :logged_in_user

    def address_params
        params.require(:address).permit(:id, :no, :street, :suburb, :code, :details, :addressable_type, :addressable_id)
    end

    def new
        if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canwrite?)
        @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"New")  
            @addresses = Address.new(:addressable_type => params[:addressable_type],:addressable_id => params[:addressable_id])
        else
        @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"New !Access Denied! ")
        flash[:notice] = "You don't have access to create Addresses."
        redirect_to :back
        end
    end

    def create
    if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canwrite?)
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Create", details: address_params)
        @addresses = Address.new(address_params)
        if @addresses.save
        flash[:notice] = 'Address Saved'
        redirect_to @address.addressable
        else
        render "new"
        end
    else
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Create !Access Denied! ")
    flash[:notice] = "You don't have access to create Addresses."
    redirect_to :back
    end
end


def edit
    if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canupdate?)
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Edit", details: params[:id])
        @address = Address.find(params[:id])
    else
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Edit !Access Denied! ", details: params[:id])
    flash[:notice] = "You don't have access to edit Addresses."
    redirect_to :back
    end
end

def update
    if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canupdate?)
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Update", details: address_params)
        @accounts = Account.all
        @address = Address.find(params[:id])
        if @address.update_attributes(address_params)
        redirect_to @address.addressable
            flash[:notice] = 'Account Updated'
        else 
        render "edit"
        flash[:error]
        end
    else
    flash[:notice] = "You don't have access to edit Addresss."
    redirect_to :back
    end
end

def show
    if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canread?)
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"View", details: params[:id])
        @address = Address.find(params[:id])
    else
    @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"View !Access Denied! ", details: params[:id])
    flash[:notice] = "You don't have access to view Addresss."
    redirect_to :back
    end
end

def destroy
    if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:candelete?)
        @address = Address.find(params[:id])
        @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Delete", details: params[:id])
        @address.destroy
        redirect_to :back
        flash[:notice] = 'Address Deleted'
    else
    flash[:notice] = "You don't have access to delete Addresss."
    redirect_to :back
    end
end


# Before Filters

# Confirms if User is logged-in
def logged_in_user
 unless logged_in?
 flash[:danger] = "Please log in."
 redirect_to root_path
 end
end
end

下面是從帳戶創建新地址時(有效)的本地主機日志:

Started GET "/addresses/new?addressable_id=1&addressable_type=account" for 127.0.0.1 at 2016-01-10 13:16:09 +1100
Started GET "/addresses/new?addressable_id=1&addressable_type=account" for 127.0.0.1 at 2016-01-10 13:16:09 +1100
Processing by AddressesController#new as HTML
Processing by AddressesController#new as HTML
  Parameters: {"addressable_id"=>"1", "addressable_type"=>"account"}
  Parameters: {"addressable_id"=>"1", "addressable_type"=>"account"}
  User Load (260.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  User Load (260.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Accessrule Load (261.2ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 3 LIMIT 1  [["role_id", 1]]
  Accessrule Load (261.2ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 3 LIMIT 1  [["role_id", 1]]
   (259.7ms)  BEGIN
   (259.7ms)  BEGIN
  SQL (261.6ms)  INSERT INTO "logs" ("user_id", "role_id", "workspace_id", "action", "created_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["user_id", 1], ["role_id", 1], ["workspace_id", 3], ["action", "New"], ["created_at", "2016-01-10 02:16:10.427199"]]
  SQL (261.6ms)  INSERT INTO "logs" ("user_id", "role_id", "workspace_id", "action", "created_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["user_id", 1], ["role_id", 1], ["workspace_id", 3], ["action", "New"], ["created_at", "2016-01-10 02:16:10.427199"]]
   (261.8ms)  COMMIT
   (261.8ms)  COMMIT
  Accessrule Load (261.6ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 2 LIMIT 1  [["role_id", 1]]
  Accessrule Load (261.6ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 2 LIMIT 1  [["role_id", 1]]
  Rendered addresses/new.html.erb within layouts/application (273.2ms)
  Rendered addresses/new.html.erb within layouts/application (273.2ms)
  Rendered layouts/_header.html.erb (2.5ms)
  Rendered layouts/_header.html.erb (2.5ms)
Completed 200 OK in 1673ms (Views: 99.7ms | ActiveRecord: 1566.9ms)
Completed 200 OK in 1673ms (Views: 99.7ms | ActiveRecord: 1566.9ms)

而在heroku中,這是行為:

2016-01-10T02:22:50.293725+00:00 heroku[router]: at=info method=GET path="/addresses/new?addressable_id=1&addressable_type=account" host=vulcanosys.herokuapp.com request_id=f09fa641-f8b4-4546-9c45-6cad598c0759 fwd="110.174.67.117" dyno=web.1 connect=13ms service=30ms status=200 bytes=4678
2016-01-10T02:22:50.274168+00:00 app[web.1]: Started GET "/addresses/new?addressable_id=1&addressable_type=account" for 110.174.67.117 at 2016-01-10 02:22:50 +0000
2016-01-10T02:22:50.279522+00:00 app[web.1]:   Accessrule Load (0.6ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 3 LIMIT 1  [["role_id", 1]]
2016-01-10T02:22:50.282693+00:00 app[web.1]:   SQL (0.5ms)  INSERT INTO "logs" ("user_id", "role_id", "workspace_id", "action", "created_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["user_id", 1], ["role_id", 1], ["workspace_id", 3], ["action", "New"], ["created_at", "2016-01-10 02:22:50.281069"]]
2016-01-10T02:22:50.288683+00:00 app[web.1]:   Accessrule Load (0.4ms)  SELECT  "accessrules".* FROM "accessrules" WHERE "accessrules"."role_id" = $1 AND "accessrules"."workspace_id" = 2 LIMIT 1  [["role_id", 1]]
2016-01-10T02:22:50.291283+00:00 app[web.1]:   Rendered layouts/_header.html.erb (0.5ms)
2016-01-10T02:22:50.276049+00:00 app[web.1]: Processing by AddressesController#new as HTML
2016-01-10T02:22:50.276089+00:00 app[web.1]:   Parameters: {"addressable_id"=>"1", "addressable_type"=>"account"}
2016-01-10T02:22:50.277601+00:00 app[web.1]:   User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
2016-01-10T02:22:50.280790+00:00 app[web.1]:    (0.4ms)  BEGIN
2016-01-10T02:22:50.284721+00:00 app[web.1]:    (1.4ms)  COMMIT
2016-01-10T02:22:50.290048+00:00 app[web.1]:   Rendered addresses/new.html.erb within layouts/application (4.3ms)
2016-01-10T02:22:50.292342+00:00 app[web.1]: Completed 200 OK in 16ms (Views: 6.6ms | ActiveRecord: 3.9ms)
2016-01-10T02:22:50.586660+00:00 heroku[router]: at=info method=GET path="/assets/main-e887d4be5a3761150a9e75e8cdbe02be8766d91d0d6fce21a598f9e45ee40bf3.css" host=vulcanosys.herokuapp.com request_id=c2aab484-4cb3-47fc-9d67-eb340f685929 fwd="110.174.67.117" dyno=web.1 connect=3ms service=5ms status=304 bytes=133
2016-01-10T02:22:50.606720+00:00 heroku[router]: at=info method=GET path="/assets/logow-bd7c174b4f1a44bb00b4fc7c15a98c7bfd339679bf9c2d101b2083369a657fc4.png" host=vulcanosys.herokuapp.com request_id=8f40c3f4-e5e6-4e0d-80fa-c38c0dba4369 fwd="110.174.67.117" dyno=web.1 connect=2ms service=7ms status=304 bytes=133
2016-01-10T02:22:50.609673+00:00 heroku[router]: at=info method=GET path="/assets/application-79669da6f547131a23184bf35af9884a3f36dac244c97e2686166cd04e33a046.js" host=vulcanosys.herokuapp.com request_id=5c1be766-73ff-4242-a6e0-263e2c194ba8 fwd="110.174.67.117" dyno=web.1 connect=15ms service=8ms status=304 bytes=133
2016-01-10T02:22:50.574276+00:00 heroku[router]: at=info method=GET path="/assets/tables-fa95ff6a0b1550437c004e8f43db0f1015ceb7461f5e91a53457daa6d06123ab.css" host=vulcanosys.herokuapp.com request_id=d04461f7-d118-41d7-b7f4-c963503590bd fwd="110.174.67.117" dyno=web.1 connect=2ms service=8ms status=304 bytes=133
2016-01-10T02:22:50.925131+00:00 heroku[router]: at=info method=GET path="/assets/logof-94cafb7b2caedd8d7695e584b5ef3055aa023d772104795b8953a6d478e09bc2.png" host=vulcanosys.herokuapp.com request_id=e418984d-f4c4-454d-8423-ba857b82b897 fwd="110.174.67.117" dyno=web.1 connect=2ms service=5ms status=304 bytes=133

我為此奮斗了一個星期,不知道該怎么辦,我什至在考慮對多態關聯進行硬編碼。

我通過執行以下步驟解決了上述問題:

將嵌套路由應用到淺淺的多態模型地址,該地址忽略了編輯,更新和刪除操作的關聯。

    shallow do
       resources :accounts do
           resources :addresses
       end
    end

    shallow do
       resources :contacts do
          resources :addresses
       end
    end

當應用程序尚未完全投入生產時,我還更改了一些設置。

Config.application.enviroment.production

    config.assets.digest = true
    config.eager_load = false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM